2012-04-09 59 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