PHP 间接修改重载属性 - 使用 ARRAYS

标签 php arrays overloading

这个错误会有很多问题,我还没有找到正确的解决方案。我的严格是 PHP 本身,而不是其他人发布的示例框架。

我正在尝试使用 __set 重载和 __get在数据数组中动态创建这些属性,但是,当我尝试在下面的示例中创建一个属性时,我收到此错误。但是如果它是字符串或整数,我可以创建属性,所以我不明白为什么它不会传递值?

Indirect modification of overloaded property ::fields has no effect



类 getter 方法:
public function __get($name)
{
    if (array_key_exists($name, $this->data))
    {
        return $this->data[$name];
    }
}

试图生成一个数组字段。 (这会导致错误)
$fieldset->fields[] = [
    'handle'      => 'first_name',
    'name'        => 'First Name',
];

这工作得很好,但这不是我要求的,我希望字段成为索引数组。
$fieldset->fields = [
    'handle'      => 'first_name',
    'name'        => 'First Name',
];

如果其他人有更好的方法,如果这是不可能的,我很想知道相同结果的替代方法。多谢你们!

最佳答案

修改您的__get返回 reference 的魔术方法到存储在数组中的属性。通知说您正在获得一份 $this->data[fields]按值(value)并附加一些东西。您正在附加到 fields 变量的副本,而不是存储在类中的实际字段。这对存储在类中的变量没有影响。

您还应该在尝试获取不存在的键时抛出异常(类似于通知 undefined variable )或创建索引并返回对它的引用。本例使用后者。

例子:

public function &__get($name)
{
    if (!array_key_exists($name, $this->data))
    {
        $this->data[$name] = null;
    }
    return $this->data[$name];
}

演示:https://3v4l.org/sdIWH

关于PHP 间接修改重载属性 - 使用 ARRAYS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45314024/

相关文章:

php&mysql 查找父类别名称

javascript - 如何从对象数组中删除对象?

arrays - 不同的类/结构符合 indexOf

overloading - 在 Perl 6 中使用自定义散列函数设置/散列

c++ - 将成员函数 const 和非常量重载传递给 std::function

php - IOS 连接到 PHP webserver 插入数据到 mysql

php - AS3 RSAKey.sign() != PHP openssl_sign() 函数

php - 哪个 PHP 接口(interface)允许使用数组表示法访问对象的属性?

haskell - Haskell 中的重载(show 和 num)

php - 修改 PHP DateTime 对象的微秒