PHP如何通过字符串调用包含数组的类成员变量?
用字符串调用类中的数组属性的正确姿势
这个问题我之前也碰到过,其实核心是PHP对可变变量的解析规则——它只会把$callName里的内容当作纯属性名来识别,不会自动解析后面的数组索引部分,所以直接写$callName = 'someVariable["my_field"]'肯定行不通。
下面给你几种可行的解决方案:
方案1:分开处理属性名和数组键(推荐)
这是最安全、可读性最高的方式,把属性名和数组索引拆成两个变量,先通过可变变量获取到数组属性,再取对应键的值:
// 定义类属性 class MyClass { public $someVariable = ['my_field' => '我是数组里的值']; public function getArrayValue() { $propName = 'someVariable'; // 存储属性名 $arrayKey = 'my_field'; // 存储数组键 // 先获取数组属性,再取键值 $value = $this->$propName[$arrayKey]; echo $value; // 输出:我是数组里的值 } }
PHP会先解析$this->$propName得到对应的数组,再自动处理后面的[$arrayKey]索引,完全符合预期。
方案2:使用eval(不推荐,有安全风险)
如果一定要用单个字符串来包含完整路径,可以用eval函数,但强烈不建议这么做——如果这个字符串来自用户输入,很容易引发代码注入漏洞:
class MyClass { public $someVariable = ['my_field' => '我是数组里的值']; public function getArrayValue() { $callName = 'someVariable[\'my_field\']'; eval('$value = $this->' . $callName . ';'); echo $value; // 输出:我是数组里的值 } }
除非你能100%确保$callName的来源绝对安全,否则别用这种方式。
为什么直接用$this->$callName不行?
PHP在解析$this->$callName时,会把$callName的内容当作完整的属性名去查找,而你的类里并没有一个名为someVariable["my_field"]的属性(属性名里不能包含[""]这类字符),自然会报错。
内容的提问来源于stack exchange,提问作者friek108
相关产品推荐
相关产品推荐

