注册表模式,单例和致命的PHP错误

时间:2013-12-03 18:21:29

标签: php singleton

我在这里看到了注册表模式问题,但是现在我被我收到的错误消息抛弃了:Using $this when not in object context ...

我从http://avedo.net/101/the-registry-pattern-and-php/获取了代码示例,我对这些代码行感到满意,但我无法解决这个问题。

编辑:我从答案中得到的结论是,我所链接的文章不应被视为“工作代码”......

以下是我的注册表类代码片段:

class registry {

    //Holds variables, objects, etc.
    private $reg = array();

    private static $instance = null;

    public static function getInstance() {
        if($this->instance === null) {     //THROWS THE FATAL ERROR
            $this->instance = new registry();
        }
        return $this->instance;
    }

    //Disallow creation of new objects, forcing use of the Singleton
    private function __construct() {}
    private function __clone() {}

我真正理解的是为什么这会引发错误。我理解$this的方式是它引用了所谓的方法,这是我的init.php文件中的这个片段:

    //Instantiate registry
    $registry = registry::getInstance();

我从阅读和编码中感到有些疲惫(过去几天我一直致力于通过构建我自己的准确小网页框架来教自己MVC如何工作)。我必须遗漏一些简单的东西,但在我看来,这正是文章所说明的内容。对于它的价值,我使用的是PHP 5.x。

如果有人觉得他们需要为我清理一些这些概念,请随意。 :)一如既往,感谢您花时间阅读本文。

5 个答案:

答案 0 :(得分:2)

在静态调用方法时,您引用了$this上下文变量,不可用

您正在使用上下文(调用foo::bar())而不是对象上下文($obj->foo()

由于它是一个单例,您应该使用self::运算符引用静态属性。

例如:

public static function getInstance() {
    if(null == self::$instance) {
        self::$instance = new self();
    }
    return self::$instance;
}

答案 1 :(得分:1)

你不能在静态方法中调用$ this。

http://php.net/manual/en/language.oop5.static.php

答案 2 :(得分:1)

您有静态函数并访问静态var,请使用:

self::$instance

$this->用于对象上下文,self::用于访问静态类成员。

答案 3 :(得分:1)

它抛出一个错误,原因就在于它确实存在错误。

当您调用STATIC函数时,您不在对象上下文中,因此$ this不存在。

self::$instance将为您效劳。

答案 4 :(得分:1)

我认为你在实例和类方法之间感到困惑。可以在不实例化该类的对象的情况下调用类方法。实例方法是从类的对象或实例中调用的。我认为$this指的是这个类的实例。

例如:$obj = new MyClass(); $obj->myInstanceMethod();

对于类(静态)方法,没有实例,因此,没有这个 例如:$returnVal = MyClass::myClassMethod();

您希望self代替this使用类方法

如果您想要澄清,请告诉我们!这是首先要掌握的OO中最棘手的部分之一