Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:非法字符串偏移量,因为[]绑定比->;_Php_Operator Precedence - Fatal编程技术网

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

PHP:非法字符串偏移量,因为[]绑定比->;,php,operator-precedence,Php,Operator Precedence,我对PHP相当陌生,刚刚有一个学习经验,我在这里分享,以帮助其他人,像我一样,可能需要帮助找到这个错误的原因,也因为我仍然不知道解决方案是什么,我确信有一个语法,我只是还没有找到做我需要做的事情 因此,问题可以通过以下方式来证明: class Sample { protected $foo = array(); public function magicSampleSetFunc($property, $key, $value) { $this->$prop

我对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_转储了
$this->$property
,看到它是一个数组,那么给出了什么呢?第二个教训是运算符优先级。数组运算符“[]”的绑定比间接运算符“->”的绑定更紧密。因此,该语句的绑定实际上类似于:
($this->)($property[$key])
。因此,它试图用$key中的索引来偏移$property中的字符串是非法的。我想要的是用$key中的索引偏移
$this->$property
中的数组

现在我们来问我的问题。我需要学习的第三个教训是,如何覆盖这个操作符优先级问题,但我还没有弄清楚?我尝试了
($this->$property)[$key]
,但这似乎是sytax错误。有没有其他语法可以让解释器理解我的意思?或者,我必须首先将
$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');

如果它不是您真正的代码,并且您还没有运行它,那么您如何确定它代表了您的问题?(提示:不是。)首先发布你的真实代码和任何错误信息,这样我们可以给你一个更具体的答案。没有看到我的真实代码,你怎么知道这不是它的代表?我真正的代码是很多很多文件,我发布的任何东西都必须是真实内容的摘要,而且我总是有错误摘要的危险。我觉得这是对我正在使用的代码的准确总结。我请你根据这段代码中的问题来回答,如果这不是我的实际问题,因为我总结错误,那就由我来回答。澄清一下:花括号用于动态更改变量/函数名,在本例中,您希望输出$property变量的内容,以便将其用作函数名或类变量nameaah。。同意。。出于某种原因,我只读“only function name”,没有提到类变量。这确实解决了这个问题。而且,这对我来说很有意义。我要澄清的是,
$property[$key]
不是我想要从中获取成员名称的变量。我遗漏的另一部分是“->”不在运算符优先级列表中。当我看到顶部附近的“[]”时,我认为它的边界比“->”紧。那么,“->”实际上绑定得更紧吗?为什么“->”没有列在运算符优先级列表上?它不被认为是一个运算符吗?哦,另外,以最佳实践的名义,总是在变量名周围加上{}是否被认为是PHP的最佳实践?“->”被称为T_OBJECT_操作符,因为在我们知道对象被初始化之前它没有任何意义,我相信优先级是从左到右的。。但我认为错误不是因为优先级,而是php如何解释变量。如果有人能纠正我的话。。