【问题标题】:PHP Indirect modification of overloaded property - With ARRAYSPHP 间接修改重载属性 - 使用 ARRAYS
【发布时间】:2017-07-25 21:44:34
【问题描述】:

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

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

间接修改重载属性 ::fields 无效

类 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',
];

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

【问题讨论】:

  • 最后一个例子是一个关联数组。第一个例子是一个多维数组。你能分享一下你在寻找什么结果吗?
  • @MagnusEriksson 我希望$fieldset->fields 像fields[0]、fields[1]、fields[2] 等。还有它们自己的数组属性。就像如果你创建动态数组,$fields[] = 'value1',$fields[] = 'value2',希望能解释一下。
  • 这不是关联数组,而是索引数组。但是,您不能使用 __set() 函数来做到这一点。您需要创建自己的方法来将新元素推送到数组属性。
  • @MagnusEriksson Gotcha,是的,这就是我的意思。你是说__set 不可能吗?我正在构建它的基础,以在公共范围内设置对象的属性为基础,而不必调用特定的函数,基本上是为了便于使用。

标签: php arrays overloading


【解决方案1】:

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

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

例子:

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

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

【讨论】:

  • 谢谢。我已经从其他解决方案中尝试过,但我向我发送了一个新错误 Cannot use object of type stdClass as array 正在尝试调试它,但也许我已经查看了这么长时间的代码。
  • 我对它进行了一些修改,以便在不存在的情况下创建一个索引,以防止出现通知错误。您还可以抛出一些类似于 php 发送的未定义变量通知的异常。
  • 根据您从哪里得到错误,这意味着$this->data 或$this->data['fields'] 不是一个数组,而是一个对象。考虑到您像数组一样访问它,我认为它是。您要么需要将其定义为数组而不是对象,要么像使用类一样使用它,这意味着追加不起作用。您还可以使用另一个类实现数组访问接口。数组和对象是完全不同的东西。对象是类的一个实例。看不到您如何定义 $this->data 或字段,我们只能猜测。
  • 好的,谢谢。 $this->data 设置为属性中的数组。我有确切的__set,__get,就像你的例子一样。这也适用于您,因此看起来像是最初问题的解决方案。我将不得不进一步挖掘,看看该属性是否被格式化为一个对象。
  • 好的,我找到了。做了一些var_dumping,发现我最初是将所有属性值转换为一个对象以保存方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 2020-03-24
  • 1970-01-01
相关资源
最近更新 更多