Может ли кто-нибудь объяснить мне логику в этом поведении?Quirky __set() magic function
Рассмотрим следующую ситуацию:
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
Actual
myValue
Очевидно,
$dmn = EPPDomainFactory::buildEPPDomain("myValue");
echo $dmn->myField;
Работы, как ожидается, выводя
prefix_myValue
Согласно __set описанию на http://www.php.net/manual/en/language.oop5.overloading.php#object.set
__set() запускается при записи данных в недоступных свойств.
Когда я создаю экземпляр EPPDomain в статическом методе класса EPPDomain, все защищенные свойства должны быть недоступны. Поэтому __set следует назвать, но это не
Я знаю, что это также говорит
собственности перегрузки работает только в контексте объекта. Эти магические методы не будут запускаться в статическом контексте. Поэтому эти методы не должны быть объявлены статическими. Начиная с PHP 5.3.0, предупреждение выдается, если один из методов перегрузки магии объявлен как статический.
Но у меня есть подавление, что он просто утверждает, что метод __set должен быть функцией класса и не должен быть статичным. Вот и все, и, похоже, это не имеет никакого отношения к ситуации, с которой я столкнулся.
Это ошибка или ожидаемое поведение?
Было бы очень полезно, если бы вы могли * упростить * этот пример кода. Это слишком сложно, чтобы продемонстрировать свою точку зрения. – deceze
Выполнено, извините, мой код намного сложнее, и я старался максимально упростить его. Наверное, не очень старался. Эта версия должна выглядеть лучше –