3

我无法理解这种行为:我的isset()支票总是在肯定有值的情况下返回false !property

<?php

  class User {
    protected $userId; // always filled
    protected $userName; // always filled

    /**
     * Magic method for the getters.
     * 
     * @param type $property
     * @return \self|property
     */
    public function __get($property) {
        if (property_exists($this, $property)) {
            return $this->$property;
        } else {
            throw new Exception('property '.$property.' does not exist in '.__CLASS__.' class');
        }
    }

  }

?>

当我使用以下内容从另一个类中检查此变量时:

isset($loggedUser->userName); // loggedUser is my instantiation of the User.php

它回来FALSE了??但是当我重载__isset()User.php 中的函数时,我会TRUE按预期返回:

public function __isset($name)
{
    return isset($this->$name);
}

只是要清楚:

echo $loggedUser->name;   // result "Adis"
isset($loggedUser->name); // results in FALSE, but why?

谢谢你的帮助!

4

4 回答 4

6

protected属性仅在对象的方法中可见。它们隐藏在外部访问的视野之外。


class prot_text {
    protected $cannot_see_me;
    function see_me() {
       echo $this->cannot_see_me;
    }
}

$x = new prot_text();
echo $x->cannot_see_me; // does not work - accessing from "outside"
$x->see_me(); // works, accessing the attribute from "inside".
于 2012-10-15T16:06:53.790 回答
5

$userName是受保护的,这意味着你不能在类之外访问它,在这个例子中从你的$loggedUser初始化。您需要以下其中一项:
1)制作public
2)编写自定义方法
3)制作魔法(__isset)函数

编辑:在不可访问的对象属性上使用 isset() 时,如果声明,将调用 __isset() 重载方法。isset() php 文档

我希望这能解释它。

于 2012-10-15T16:07:57.887 回答
1

$userName 是受保护的,因此只能从定义它的类或任何扩展它的类内部访问它。

于 2012-10-15T16:07:07.410 回答
1

这是因为财产受到保护。不能在对象(或子对象)之外访问受保护的属性。重载函数是在类中定义的,因此可以正常工作。

这是 OOP 的一个特性:(http://php.net/manual/en/language.oop5.visibility.php)如果您想让它在任何地方都可以访问,请将属性定义为公共,否则将该特定功能包装在公共中功能。

于 2012-10-15T16:07:32.287 回答