PHP文件包含时触发Cannot use [] for reading错误排查咨询
问题分析:PHP抛出「Cannot use [] for reading」异常的原因
先看你提供的出问题的控制器代码:
<?php namespace FrameWork\Controller; abstract class ControllerBase { protected $action; protected $vars; public function __construct($action, $vars = NULL) { $this->action = $action; $this->vars = $vars; $this->populateVars(); } public function run() { ****BETWEEN HERE**** $r = new \ReflectionMethod($this, $this->action); $params = $r->getParameters(); $funcParams[]; // 这里就是问题所在! foreach($params as $param) { $paramName = $param->getName(); $funcParams[$paramName] = $this->vars[$paramName]; } ****AND HERE**** call_user_func_array(array($this, $this->action), $funcParams); } private function PopulateVars() { foreach($_GET as $key => $getVar) { $this->vars[$key] = $getVar; } foreach($_POST as $key => $postVar) { $this->vars[$key] = $postVar; } } }
问题根源
触发「Cannot use [] for reading」异常的直接原因是这行代码:$funcParams[];
这行代码的写法完全错误——它试图读取一个未初始化数组的「下一个元素位置」,但PHP不允许这种操作。你本来的意图应该是初始化一个空数组,对吧?那正确的写法应该是:
$funcParams = [];
当你写$funcParams[]的时候,PHP会认为你想获取这个数组的下一个元素的值,但此时$funcParams还没被定义成数组,甚至连变量都没初始化,自然会抛出语法错误。把这行改成数组初始化后,后续的foreach循环就能正常往里面填充键值对,call_user_func_array也能拿到正确的参数数组了。
额外小提示
另外注意到你的私有方法定义的是PopulateVars()(首字母大写P),但构造函数里调用的是$this->populateVars();(小写p)。虽然PHP的方法名不区分大小写,不会触发错误,但为了代码的规范性和可读性,建议保持命名一致,避免后续维护时产生混淆。
内容的提问来源于stack exchange,提问作者Matthew Goulart
相关产品推荐
相关产品推荐

