gpt4 book ai didi

php - 古怪的 __set() 魔法函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:44 27 4
gpt4 key购买 nike

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

考虑以下情况:

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 的实例时,所有 protected 属性都应该是不可访问的。因此 __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 方法应该是一个类成员函数,而不应该是静态的。就是这样,似乎与我面临的情况无关。

这是错误还是预期的行为?

最佳答案

protected 属性对相同或继承中的所有代码可访问。重点是

class Foo {

protected $bar;

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

}

这很好用。 正在处理它自己的一个实例,它可以访问自己的属性。这与“外部实例”无关,与类有关。

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

关于php - 古怪的 __set() 魔法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com