微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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';
    }

}

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐