问题描述
|
我需要从PHPCassa项目中选两个类。在将类设为静态之前,我可以在selectColumnFamily中调用该方法。但是现在它不起作用。有没有解决的办法?这也是最好的策略吗?我只是想不必每次都重新连接到Cassandra DB。因此,如果我使用CASSANDRA ::它只会连接一次还是多次?
在此先感谢您的帮助。
class CASSANDRA {
protected static $config = array();
protected static $keyspace = NULL;
protected static $servers = array();
public static $pool = NULL;
public function __construct()
{
require_once (\'PHPcassa/connection.PHP\');
require_once (\'PHPcassa/columnfamily.PHP\');
// Test the config group name
$config = Kohana::config(\'cassandra\');
self::$servers = $config[\'servers\'];
self::$keyspace = $config[\'keyspace\'];
self::$pool = new ConnectionPool($this->keyspace,$this->servers);
}
public static function selectColumnFamily($column_family_name)
{
return new ColumnFamily(self::$pool,$column_family_name);
}
}
解决方法
好的,首先您使用$ this访问静态变量,这是错误的:
self::$pool = new ConnectionPool($this->keyspace,$this->servers);
您应该使用self::
而不是$this->
。
但是主要的问题是:使用类的静态方法时不会调用构造函数! (好吧,除非您之前刚刚做过new CASSANDRA()
,否则这样做是没有意义的)。
在这里,您可以在构造函数中设置连接,但是如果不调用它,则ѭ5将会失败,因为它将尝试使用未设置的连接。
一种快速解决的方法是将__construct()
方法重命名为static init()
,并在使用类时执行此操作:
CASSANDRA::init();
$foo = CASSANDRA::selectColumnFamily(...);
但是,我强烈建议您阅读一个好的教程,并使用对象而不是静态类正确使用OOP。