Php 访问类内的静态属性会得到';未定义变量';通知

Php 访问类内的静态属性会得到';未定义变量';通知,php,class,static,Php,Class,Static,我正在编写一个最小依赖注入类。然而,当我试图访问静态方法中的静态属性时,php会发出“Undefined variable”通知。代码如下: class DI{ /** * @var array $registry Class dependency resolving functions */ public static $registry = []; /** * @var array $instances Class instances for singleton classes *

我正在编写一个最小依赖注入类。然而,当我试图访问静态方法中的静态属性时,php会发出“Undefined variable”通知。代码如下:

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

正如您所提到的,问题如下:

$instance = self::$registry[$className]['resolve']();
PHP尝试使用$registry数组(不是静态类属性!)中的字符串值名称调用函数。虽然只有一个静态::$registry数组存在,并且没有本地$registry数组,但php打印未定义的通知

由于函数调用,PHP解析此语句的方式与以下伪代码类似:

$string = $registry[$className]['resolve'];
$result = $string();
$instance = self::{result of function call}; 
这也是您的解决方案有效的原因。 也许静态getter方法可以封装数组访问逻辑

对于这种行为也有一个bug:并且有一个解释是,这种行为预期会像它一样工作