谁能解释一下这种行为的逻辑?
考虑以下情况:
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 开始,如果其中一个魔术重载方法被声明为静态,则会发出警告。
但我有一个印象,它只是声明 __set 方法应该是一个类成员函数,而不应该是静态的。就是这样,它似乎与我所面临的情况无关。
这是一个错误还是预期的行为?