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

注册表模式、单例和致命的PHP错误,php,singleton,Php,Singleton,我在这里看到了注册表模式的问题,但现在我被收到的错误消息甩了:在不在对象上下文中时使用$this 我从中获取了代码示例,并仔细研究了这些代码行,但我就是无法理解这个问题 编辑:我从答案中感觉到,我链接的文章不应该被视为“工作代码” 以下是我的注册表类代码片段: class registry { //Holds variables, objects, etc. private $reg = array(); private static $instance = null

我在这里看到了注册表模式的问题,但现在我被收到的错误消息甩了:
在不在对象上下文中时使用$this

我从中获取了代码示例,并仔细研究了这些代码行,但我就是无法理解这个问题

编辑:我从答案中感觉到,我链接的文章不应该被视为“工作代码”

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

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();
我在阅读和编写代码的过程中感到有点疲惫(过去几天我一直致力于通过构建自己的基本web框架来自学MVC的工作原理)。我肯定错过了一些简单的东西,但在我看来,这正是本文所阐述的。无论如何,我使用的是PHP5.x


如果有人觉得他们需要为我澄清其中一些概念,请随时回答。:)一如既往,感谢您抽出时间阅读此内容。

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


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


如果您有一个静态函数并访问一个静态变量,请使用:

self::$instance

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

如果您有一个静态函数并访问静态变量,请使用:

self::$instance

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

它抛出错误的确切原因是它说它会抛出错误

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


self::$instance
将为您工作。

它会抛出一个错误,原因与它所说的完全相同

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


self::$instance
将为您工作。

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

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

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

例如:

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

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

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

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

例如:

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

我认为您正在混淆实例方法和类方法。可以调用类方法,而无需实例化该类的对象。实例方法是从类的对象或实例调用的。将
$this
视为引用该类的实例

e、 g.:
$obj=newmyclass()
$obj->myInstanceMethod()

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

您可能希望在类方法中使用
self
而不是
this


如果你还需要澄清,请告诉我!这是OO中最棘手的部分之一,一开始需要掌握

我想你会混淆实例方法和类方法。可以调用类方法,而无需实例化该类的对象。实例方法是从类的对象或实例调用的。将
$this
视为引用该类的实例

e、 g.:
$obj=newmyclass()
$obj->myInstanceMethod()

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

您可能希望在类方法中使用
self
而不是
this


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

您确实应该避免在项目中使用单例和其他形式的全局状态。创建注册表对象并将其传递给需要访问其项的其他对象是否更好?您可能应该从观看和讲座开始。这应该可以解释全球国家造成的问题,并提出解决方案。太棒了!我总是喜欢新的学习资源。谢谢@tereško然后你应该开始往下看(这两个视频也在里面..难度大致合适)您确实应该避免在项目上使用单例和其他形式的全局状态。创建注册表对象并将其传递给需要访问其项的其他对象是否更好?您可能应该从观看和讲座开始。这应该可以解释全球国家造成的问题,并提出解决方案。太棒了!我总是喜欢新的学习资源。谢谢@tereškoThen你应该开始往下看(这两个视频也在那里..在大致合适的难度水平上)我感觉我正在使用的文章实际上提供了一些非常糟糕的代码,然后…@ArmadDrive我认为即使使用单例模式也不好谢谢。关于这个问题,我已经读了一些很好的书,但是现在你的回答解决了我的问题,并且解释得很好。我感觉我正在使用的文章实际上提供了一些非常糟糕的代码,然后…@armadadrive我认为即使使用单例模式也是糟糕的设计谢谢。我是