2012-04-09 46 views
0

我正在使用Kohana MVC框架。我想添加一個可以與PHPCassa對象(Cassandra NoSQL)一起工作的模塊。在PHP中創建時的空對象

問題是,當我創建對象時,我擁有所有的屬性,我可以在構造中與它交互,但是當我從不同的位置創建對象時,它將返回爲空對象。

我敢肯定,我錯過了一些東西,因爲我剛剛接觸OOP。請幫我在這裏。

模塊文件

<?php 

// Loading cassandra libraries, tried to load them here, did not help 
//require 'application/modules/cassandra/lib/connection.php'; 
//require 'application/modules/cassandra/lib/columnfamily.php'; 

class Cassandra { 

    function __construct($columnFamily) { 
     // Loading cassandra libraries 
     require 'application/modules/cassandra/lib/connection.php'; 
     require 'application/modules/cassandra/lib/columnfamily.php'; 

     $pool = new ConnectionPool('localhost'); 
     $cf = new ColumnFamily($pool, $columnFamily); 

     // print_r($cf); // This will print object with all the proporties that I can use 

     return $cf; 
    } 

類,將加載模塊和將創建空對象

<?php 

class Controller_Main extends Controller { 

    public function action_index() { 
     $a = new Cassandra('timeline'); 
     echo '<pre>'; 
     print_r($a); // This will print out empty Cassandra object 
     die(); 

     //$this->response->body('hello, world!'); 
    } 

} 

回答

0

這樣做是錯誤的方式,要創建在構造函數中兩個Object,一個Cassandra對象,另一個是ColumnFamily明明new Cassandra('timeline');將返回Cassandra對象。

試試這個方法:

class Cassandra { 

    static function LoadCassandra($columnFamily) { 
     // Loading cassandra libraries 
     require 'application/modules/cassandra/lib/connection.php'; 
     require 'application/modules/cassandra/lib/columnfamily.php'; 

     $pool = new ConnectionPool('localhost'); 
     $cf = new ColumnFamily($pool, $columnFamily); 

     return $cf; 
    } 

並使用它:

class Controller_Main extends Controller { 

    public function action_index() { 
     $a = Cassandra::LoadCassandra('timeline'); 
     echo '<pre>'; 
     print_r($a); // This will print out empty Cassandra object 
     die(); 

     //$this->response->body('hello, world!'); 
    } 

} 
+0

是的,這工作正常。謝謝。 – sed 2012-04-09 12:52:20

+0

不客氣。請檢查@ cilosis的解決方案,他的方法是如果你的包裝類對象,即Cassandra'object'要在內部操縱對象'ColumnFamily'和'ConnectionPool',你的設計將決定向哪個方向前進。使用單例模式:http://php.net/manual/en/language.oop5.patterns.php如果你要按我的方式 – sakhunzai 2012-04-09 13:04:11

1

連接池的ColumnFamily因此一旦它完成正在僅用於在構造,他們不再存在。另外,當使用新的調用PHP構造函數時,會返回一個新實例,而不是您嘗試的方式的return值。也許嘗試是這樣的:

<?php 

require_once 'application/modules/cassandra/lib/connection.php'; 
require_once 'application/modules/cassandra/lib/columnfamily.php'; 

class Cassandra { 

    public $pool = null; 
    public $cf = null; 

    function __construct($columnFamily) { 

     $this->pool = new ConnectionPool('localhost'); 
     $this->cf = new ColumnFamily($this->pool, $columnFamily); 

     return $this; 

    } 
} 

嘗試這樣做,然後var_dump()$一個看到整個卡桑德拉對象或$ A-> CF看到的ColumnFamily對象。應該告訴你你需要什麼。

+0

嗯,使用此我的對象是滿的,但我不能使用在任何功能'$這個 - > cf'。當我嘗試做'$ a-> add('1','test');'它給了我'ErrorException [致命錯誤]:調用未定義的方法Cassandra :: add()'。然而,內部構造我可以使用它。 – sed 2012-04-09 12:48:47

+0

Cassandra對象不能有'add()'方法。如果你打算用ColumnFamily對象來做,你必須像這樣調用它'$ cassandra_object-> cf-> add();' – 2012-04-09 23:43:59