我以前从未开发过,我有点疑惑,我的语法出了什么问题?
private static $instance; //holder of Mongo_Wrapper
public $connected = true;
private $mongo = null; // The mongo connection affiliation
private $database = null; // The database we are working on
使用此功能:
public function mongo_connect($db_name) {
if (! self::connected) {
$this->mongo = new Mongo;
//TODO: error handle this whole sharade: throw new Kohana_Database_Exception('Cant connect', NULL, 503);
$this->connected = true;
}
$this->database = $this->mongo->$db_name; //set the database we are working on
return $connected;
}
对不起,wmd-editor正在给我发布代码。
谢谢!
编辑: $ connected不是静态的,问题是它无法使用static或$ this。 此外,这是一个单身人士课程,我不知道这是否重要。
编辑:这是代码的其余部分,此处为self,并且正常运行:
public static function singleton($db_name) {
if (!isset(self::$instance)) {
$c = __CLASS__;
$this->$instance = new $c;
}
self::mongo_connect($db_name);
return self::$instance;
}
enter code here
答案 0 :(得分:2)
if (! self::connected) {
可能是导致错误的原因。当您尝试访问静态类成员(连接不是)时,您只使用self,并且您必须在开头使用$ -Sign,否则您要求类常量。所以你要么必须声明连接为静态,要么使用$ this->访问它。
在PHP手册中查看static class members!
在编写像这样的代码之前,你应该真正尝试理解OOP的工作原理。 PHP告诉您不能使用$ this,因为您不在对象上下文中,这意味着您从未使用 new 创建对象实例。
也许PHP OOP Basics会帮助你。
不幸的是,PHP允许你静态调用实际上没有的方法,这可能会导致错误。但是迟早(可能更早)你将需要了解OOP基础知识,所以在尝试编写代码以便高效使用之前,请先使用几个简单的类。
另请查看此sample implementation of the singleton pattern。
如果您需要有关此问题的进一步帮助,请告诉我们您如何调用connect方法!
我们有你的问题。您正在执行以下操作:
self::mongo_connect($db_name);
这意味着“静态调用mongo_connect”。 你真正需要做的是:
self::$instance->mongo_connect();
这相当于“在自我的单例实例上调用mongo_connect”。
但是请仔细看看基本的PHP教程,因为你在代码中所做的事情大多是错误的......
$this->$instance = new $c;
在很多方面都是错误的......不仅因为你在静态上下文中使用$ this,而且还因为你将创建的实例分配给名为中的的类成员/ em> $ instance,似乎是空的......不知道这实际上是如何工作的......
答案 1 :(得分:0)
self
应与静态成员一起使用(使用$this->connected
代替self::connected
)。
<强>更新强>
private static function mongo_connect($db_name, $instance)
{
if (!$instance->connected) {
....
}
...
return $instance->connected;
}
public static function singleton($db_name) {
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
self::mongo_connect($db_name, self::$instance );
return self::$instance;
}
答案 2 :(得分:0)
x3ro是对的。您还需要最后的$ this-&gt;连接语法:
return $this->connected;
如果您在使用$ this-&gt; connected时收到错误消息,那是因为您的函数不是类中的方法,而是全局函数。