Validator Readability and Efficiency
Although you used a Validator class, this is not really object orientated. Actually I'm missing a Rule class. Your rules are applied by comparing strings right now, which is error prone and really ugly if you need to refactor it. Extending your code with new rules also requires changing the Validator itself.

class Rule {
     /**
      * @return bool
      */
     abstract function check($value);
     /**
      * @return string
      */
     abstract function getErrorMessage($value)
}

class BetweenRule extends Rule{ //Maybe there is also an IntegerRule to collect some operations.
     private $min;
     private $max;

     public function __construct ($min,$max) {...}

     public check($value)
     {
          return this-&gt;min&lt;=$value &amp;&amp; $this-&gt;max&gt;=$value;
     } 

     public function getErrorMessage($value) { return $valus." is not between ..." ;}
}
...


And the usage:

$v = new Validator();
$r=new RequiredRule();

$v-&gt;setRule('email', [$r, new BetweenRule(5,255), new EmailRule()]);
$v-&gt;setRule('password', [$r]);

if (!$v-&gt;getErrors()) {  //either as a list of string or list of map fields and rules
     ...
} else {
     ...
}


As you can't type hint the content of an array, you might also want to replace setRule by addRule and append new rules to the existing ones, instead setting the array of rules.

$v = new Validator();
$v-&gt;addRule('email', new RequiredRule());
$v-&gt;addRule('email', new BetweenRule(5,255));
$v-&gt;addRule('email', new EmailRule());