0

我对 PHP 还很陌生,只是在这里分享了一个学习经验,以帮助像我一样可能需要帮助的其他人来找到此错误的原因,并且因为我仍然不知道解决方案是什么肯定有一个我还没有找到的语法来做我需要做的事情。

所以,这个问题可以用这样的东西来证明:

class Sample {
    protected $foo = array();
    public function magicSampleSetFunc($property, $key, $value) {
        $this->$property[$key] = $value;
    }
}
...
$s = new Sample();
$s->magicSampleSetFunc('foo', 'someKey', 'someVal');

显然,这不是我的真实代码(我也没有运行它),这只是解释我的情况的一个最小示例。这里我们有一个成员变量 foo ,它显然是一个数组和一个通用函数,它将尝试在其中设置一个键和值。我可以 var_dump$this->$property并看到它是一个数组,但$this->$property[$key]在线上我收到错误消息:“警告:非法字符串偏移 'someKey' in ...”。

起初我虽然说'someKey'是一个非法字符串,用作数组偏移量,这没有意义。而且,即使我将它包装在 isset 中,它也会抱怨。我学到的第一件事是,如果您在 php 中有一个字符串,您可以使用数组访问运算符从该字符串中获取一个字符。因此,警告消息实际上是在抱怨“someKey”不是字符串的有效偏移量(因为它不是整数偏移量)。好的,但我只是 var_dumped$this->$property并看到它是一个数组,那么给出了什么?第二课是运算符优先级。数组运算符“[]”比间接运算符“->”绑定得更紧密。因此,该语句的绑定实际上类似于:( $this-> ( $property[$key] ) ). 因此,它非法地试图通过 $key 中的索引来抵消 $property 中的字符串。我想要的是$this->$property通过 $key 中的索引来偏移数组。

所以,现在我们来回答我的问题。我需要学习但还没有弄清楚的第三课是如何覆盖这个运算符优先级问题?我试过($this->$property)[$key]了,但这似乎是一个语法错误。我可以使用其他一些语法来让解释器理解我的意思吗?或者,我必须先分配$this->$property一个临时变量吗?如果我这样做,那是否意味着我的实际成员变量数组没有更新?我需要临时参考还是什么?什么是适合我的情况的正确语法?谢谢!

4

1 回答 1

2

这是这样做的方法:你的变量名基本上是{$property}这样的,当你这样做时,$this->$property[$key]我认为 PHP 解析器会感到困惑。我通常确保向解析器明确声明我的变量名是 $property,这是通过在变量周围使用花括号来完成的。

花括号用于显式指定变量名的结尾

class Sample {
    protected $foo = array();
    public function magicSampleSetFunc($property, $key, $value) {
        $this->{$property}[$key] = $value;
    }
}
...
$s = new Sample();
$s->magicSampleSetFunc('foo', 'someKey', 'someVal');
于 2013-05-12T23:32:48.020 回答