在静态类中使用require_once

问题描述

| 我需要从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。