php – Quirky __set()魔术函数

任何人都可以解释一下这种行为的逻辑吗?

考虑以下情况:

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() is run when writing data to inaccessible properties.

当我在EPPDomain类的静态方法中创建EPPDomain的实例时,所有受保护的属性都应该是不可访问的.因此应调用__set,但不是

我知道它也说

Property overloading only works in object context. These magic methods
will not be triggered in static context. Therefore these methods
should not be declared static. As of PHP 5.3.0, a warning is issued if
one of the magic overloading methods is declared static.

我有一个表达式,它只是声明__set方法应该是一个类成员函数,不应该是静态的.就是这样,它似乎与我所面临的情况无关.

这是一个错误或预期的行为?

解决方法:

受保护的属性可供相同或继承类中的所有代码访问.重点是课堂.

class Foo {

    protected $bar;

    public function foo() {
        $foo = new self;
        $foo->bar = 'baz';
    }

}

这很好用.该类正在处理自身的实例,它可以访问自己的属性.这不是关于“外国事例”,而是关于阶级.

受保护属性的要点是它们的存在或实现应该只与定义它们的类相关.其他代码不应该直接搞乱它们.由于可以假设类知道如何处理自己的属性,因此可以信任类来操纵其类型的任何对象的属性.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...