有人能解释一下这种行为的逻辑吗?
考虑以下情况:
class EPPDomain
{
protected $myField;
public static function buildEPPDomain($fieldValue)
{
$me = new self();
$me->myField = $fieldValue;
return $me;
}
public function __set($name, $value)
{
$this->$name = "prefix_".value;
}
}
class EPPDomainFactory
{
public static function buildEPPDomain($fieldValue)
{
$me = new EPPDomain();
$me->myField = $fieldValue;
return $me;
}
}
所以
$dmn = EPPDomain::buildEPPDomain("myValue");
echo $dmn->myField;
预期
prefix_myValue
实际
myValue
显然,
$dmn = EPPDomainFactory::buildEPPDomain("myValue");
echo $dmn->myField;
按预期输出工作
prefix_myValue
根据http://www.php.net/manual/en/language.oop5.overloading.php#object.set
上的__set说明__ set()在将数据写入不可访问的属性时运行。
当我在EPPDomain类的静态方法中创建EPPDomain实例时,所有受保护的属性都应该是不可访问的。因此应该调用__set,但它不是
我知道它也说
属性重载仅适用于对象上下文。这些神奇的方法 不会在静态上下文中触发。因此这些方法 不应该声明为静态。从PHP 5.3.0开始,如果发出警告 其中一个神奇的重载方法被声明为static。
但我有一个表达式,它只是声明__set方法应该是一个类成员函数,不应该是静态的。就是这样,它似乎与我所面临的情况无关。
这是一个错误还是预期的行为?
答案 0 :(得分:5)
对于相同或继承的类中的所有代码,<{1}}属性可访问。重点是 class 。
protected
这很好用。 类正在处理自己的实例,它可以访问自己的属性。它不是关于&#34;外国实例&#34;,它关于这个课程。
受保护属性的要点是它们的存在或实现应该只与定义它们的类相关。其他代码不应该直接搞乱它们。由于可以假设一个类知道如何处理它自己的属性,因此可信任一个类来操纵其类型的任何对象的属性。
答案 1 :(得分:0)
这是预期的行为,因为方法确实可以访问其类实例的受保护(甚至私有)属性。