php - OO PHP 保护的属性在 foreach 循环中不可用?

标签 php object

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

我正在将一个对象从另一个类(在本例中为用户)传递给验证类中的静态函数

function validate() {
    $errors = Validation::validate($this);
}

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

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;
        }

我纯粹出于测试目的打印出函数内的值。我不明白的是为什么对象在 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 类,所以我理解为什么这些值不可用,只是不知道为什么它们在循环外可用但在循环内不可用。

此外,对 protected /私有(private)属性进行验证的最佳方法是什么?

如有任何建议/提示,我们将不胜感激。

谢谢。

最佳答案

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

Members declared protected can be accessed only within the class itself and by inherited and parent classes.

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

print_r(), var_dump() and var_export() will also show protected and private properties of objects with PHP 5. Static class members will not be shown.

仅仅因为 print_r() 可以打印一些东西,并不意味着它可以被您的代码访问。将 print_r()、var_dump() 和 var_export() 视为“特殊”函数。

关于php - OO PHP 保护的属性在 foreach 循环中不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1646270/

相关文章:

php - 根据下拉选择从数据库中填充另一个选择下拉列表

apache - phpinfo() 什么都不输出

php - 如何将此 MySQL 语句转换为 symfony Propel?

c++ - C++字符串用户输入到类对象?

image - 如何在openCV中访问或检测对象的长度?

javascript - 为什么需要在对象中使用 this.property=property ?

javascript - 尝试使用循环的结果并将其记录到控制台

php - 图像调整大小 % 不同的比率

java - 克隆对象

php - 为什么 PHP 类型转换会这样? (int) 四舍五入的数字?