我在这里看到了注册表模式问题,但是现在我被我收到的错误消息抛弃了: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。
如果有人觉得他们需要为我清理一些这些概念,请随意。 :)一如既往,感谢您花时间阅读本文。
答案 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。
答案 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中最棘手的部分之一