在foreach循环中没有的OO PHP保护属性?

Dan*_*Dan 3 php object

我有一个验证类,我想用它来检查我的应用程序中的所有值是否在允许的约束内.

我将一个对象传递给验证类中的静态函数,来自另一个类(在本例中为User)

function validate() {
    $errors = Validation::validate($this);
}
Run Code Online (Sandbox Code Playgroud)

在验证类中,我创建一个新对象,然后继续处理传递的参数对象的属性(或者至少这是我想要做的).

function validate($object) {
            $validation = new Validation();
            print_r($object);
            print_r('<br />');
            foreach($object as $key => $val) {
                print_r($val);
                isset($val->maxlength) ? $validation->validateLengthNoMoreThan($val->value, $val->maxlength) : null;
                isset($val->minlength) ? $validation->validateLengthAtLeast($val->value, $val->minlength) : null;
                isset($val->required) && ($val->required == true) ? $validation->validateNotBlank($val->value) : null;
            }
            return $validation->errors;
        }
Run Code Online (Sandbox Code Playgroud)

我在函数中打印出的值纯粹是出于测试目的.我不明白的是为什么对象在foreach循环之外打印得很好,但如果我尝试访问循环中的值,则不会显示任何内容.

这是foreach循环外部显示的内容:

User Object ( 
[username:protected] => Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 ) 
[firstname:protected] =Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 )
[lastname:protected] =Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 ) 
) 

验证类不扩展User类,所以我理解为什么这些值不可用,只是为什么它们在循环之外可用但不在其中.

此外,对受保护/私有属性进行验证的最佳方法是什么?

任何建议/提示将不胜感激.

谢谢.

Sco*_*ers 9

来自docs(http://us3.php.net/manual/en/language.oop5.visibility.php):

声明受保护的成员只能在类本身以及继承和父类中访问.

http://us3.php.net/manual/en/function.print-r.php:

print_r(),var_dump()和var_export()也将显示PHP 5对象的受保护和私有属性.将不显示静态类成员.

仅仅因为print_r()可以打印某些东西,并不意味着你的代码可以访问它.将print_r(),var_dump()和var_export()视为"特殊"函数.