注册表模式、单例和致命的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我认为即使使用单例模式也是糟糕的设计谢谢。我是