我正在编写一个最小依赖项注入类。但是,当我试图访问静态方法内的静态属性时,php会发出“未定义变量”通知。守则是:
class DI{
/**
* @var array $registry Class dependency resolving functions
*/
public static $registry = [];
/**
* @var array $instances Class instances for singleton classes
*/
public static $instances = [];
public static function register($className, $singleton, $resolve){
self::$registry[$className] = ['resolve' => $resolve, 'singleton' => $singleton];
}
public static function inject($className){
if(array_key_exists($className, self::$registry)){
if(array_key_exists($className, self::$instances)) {
return self::$instances[$className];
}
else{
// Problem occurs at that line:
$instance = self::$registry[$className]['resolve']();
if(self::$registry[$className]['singleton']){
self::$instances[$className] = $instance;
}
return $instance;
}
}
else{
return false;
}
}
}但是,如果我将该行改为这两行,问题就会消失:
$instance = self::$registry;
$instance = $instance[$className]['resolve']();这就是PHP的注意事项:
Notice: Undefined variable: registry in /var/www/lib/DI.class.php on line 32发布于 2014-04-26 20:47:17
正如您所提到的,问题是下面一行:
$instance = self::$registry[$className]['resolve']();PHP尝试使用$registry数组中字符串值的名称(而不是静态类属性!)调用函数。虽然只有静态::$注册表数组存在,并且没有本地$registry数组,但是php打印未定义的通知。
由于函数调用,PHP像下面的伪代码一样解析这些语句:
$string = $registry[$className]['resolve'];
$result = $string();
$instance = self::{result of function call}; 这也是你的解决方案奏效的原因。也许静态getter方法可以封装数组访问逻辑。
还有一个针对这种行为的错误:https://bugs.php.net/bug.php?id=55573和一种解释,希望它能像它一样工作。
https://stackoverflow.com/questions/23315961
复制相似问题