PHP:非法字符串偏移,因为[]绑定比->更紧


PHP: Illegal string offset because [] binds tighter than ->

我对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'在…"。

起初我以为它是说'someKey'是一个非法字符串用作数组偏移,这没有意义。即使我把它包装在isset中,它也会报错。我学到的第一件事是,如果你在php中有一个字符串,你可以使用数组访问运算符从这个字符串中获取一个字符。所以警告消息实际上是抱怨'someKey'不是一个有效的偏移到一个字符串(因为它不是一个整数偏移)。好的,但我只是var_dump $this->$property,看到它是一个数组,那么会发生什么呢?第二个教训是运算符优先级。数组操作符"[]"比间接操作符"->"绑定更紧密。因此,该语句的绑定实际上类似于:( $this-> ( $property[$key] ) )。因此,它试图用$key中的索引来偏移$property中的字符串是非法的。我想要的是用$key中的索引来偏移$this->$property中的数组。

那么,现在我们来回答我的问题。我需要学习的第三个教训是,我如何覆盖这个操作符优先级问题?我尝试了($this->$property)[$key],但这似乎是一个语法错误。我可以使用其他语法来让解释器理解我的意思吗?或者,我必须先将$this->$property分配给临时变量吗?如果我这样做,这是否意味着我的实际成员变量数组没有更新?我需要临时推荐信吗?这里的语法是什么?谢谢!

是这样做的:你的变量名基本上是{$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');