在静态类中使用require_once

时间:2011-06-15 19:08:12

标签: cassandra php-5.3

我要求PHPCassa项目中的两个班级进入我的班级。在我创建Class静态之前,我能够在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);

    }

}

1 个答案:

答案 0 :(得分:1)

好的,首先你使用$ this来访问静态变量,这是错误的:

self::$pool = new ConnectionPool($this->keyspace, $this->servers);

您应该使用self::代替$this->

但主要的问题是:在使用类的静态方法时没有调用构造函数!(好吧,除非你之前做过new CASSANDRA(),但这没有任何意义这样做。)

在这里,您在构造函数中设置连接,但如果您不调用它,则selectColumnFamily将失败,因为它将尝试使用未设置的连接。

解决这个问题的一种快速方法是将__construct()方法重命名为static init(),并在使用该类时执行此操作:

CASSANDRA::init();
$foo = CASSANDRA::selectColumnFamily(...);

但我强烈建议你阅读一本好的教程并正确使用OOP,使用对象而不是静态类。