首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问类中的静态属性会发出“未定义变量”通知

问访问类中的静态属性会发出“未定义变量”通知
EN

Stack Overflow用户
提问于 2014-04-26 20:09:10
回答 1查看 1.2K关注 0票数 0

我正在编写一个最小依赖项注入类。但是,当我试图访问静态方法内的静态属性时,php会发出“未定义变量”通知。守则是:

代码语言:javascript
复制
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;
    }
}
}

但是,如果我将该行改为这两行,问题就会消失:

代码语言:javascript
复制
$instance = self::$registry;
$instance = $instance[$className]['resolve']();

这就是PHP的注意事项:

代码语言:javascript
复制
Notice: Undefined variable: registry in /var/www/lib/DI.class.php on line 32
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-26 20:47:17

正如您所提到的,问题是下面一行:

代码语言:javascript
复制
$instance = self::$registry[$className]['resolve']();

PHP尝试使用$registry数组中字符串值的名称(而不是静态类属性!)调用函数。虽然只有静态::$注册表数组存在,并且没有本地$registry数组,但是php打印未定义的通知。

由于函数调用,PHP像下面的伪代码一样解析这些语句:

代码语言:javascript
复制
$string = $registry[$className]['resolve'];
$result = $string();
$instance = self::{result of function call}; 

这也是你的解决方案奏效的原因。也许静态getter方法可以封装数组访问逻辑。

还有一个针对这种行为的错误:https://bugs.php.net/bug.php?id=55573和一种解释,希望它能像它一样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23315961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档