可以将类对象传递给另一个类吗? PHP

问题描述:

我正在编写我的第一个对象工厂,并且我想知道在创建第二个对象时是否有任何缺点将一个对象传递到另一个对象,然后将第一个对象保存在第二个对象*以后使用?可以将类对象传递给另一个类吗? PHP

例子:

class main 
{ 
    public $connection = array(); 

    // various other useful functions that should be loaded on every page here 
    // these other functions would be convenient to have avail for 
    // new objects in different classes 

    function dbconnect($db) { 
     if(!isset($this->connection[$db])) { 
      switch($db) { 
       case "users": 
        $connection = @mysql_connect(info,info,info); 
        $db_select = @mysql_select_db(info,$connection); 
        $this->connection[$db] = $connection; 
       break; 

       case "ads": 
        $connection = mysql_connect(info,info,info); 
        $db_select = mysql_select_db(info,$connection); 
        $this->connection[$db] = $connection; 
       break; 

       default: 
        die($db . " is not a recognized database."); 
       break; 
      } 
     } 

     return $this->connection[$db]; 
    } 

    // note how i pass $this into the new object in this function 
    function create($class,$params=null) { 
     if(!class_exists($class) && !$this->load($class)) { 
       die($class . " is not a recognized class."); 
     }else{ 
       return new $class($this,$params); 
     } 
    } 

    function load($file) { 
     $file = $_SERVER['DOCUMENT_ROOT'] . "/classes/" . $file . ".class.php"; 
     if(file_exists($file)) { 
       return require_once($file); 
     }else{ 
       return false; 
     } 
    } 
} 

class secondary { 

    private $connection; 
    private $mainObj; 
    private $params; 

    function __construct($mainObj,$params) { 

     $this->mainObj = $mainObj; 
     $this->params = $params; 

     $this->connection = $mainObj->dbconnect('users'); 

    } 
} 

正如你在这里看到,由工厂创建的任何类方便了连接到MySQL数据库,如果类需要它(以及其他共同/有用的功能)的能力...而不必使用全局变量,或者通过很多东西。

这是一种稳定的方式吗?我是新人,可以运用一些很好的理论/教育来解释为什么这是错误的 - 如果是这样。

+0

你可能想阅读有关依赖注入。 http://en.wikipedia.org/wiki/Dependency_injection – jason 2009-07-31 23:03:43

是的,这是一个非常稳定的方式。但我希望在外部实例作为参数的方法中看到type hinting,这将使您的类更强大。

示例;如果Alob :: amethod方法()被调用,其他类型的斑点比

class Alob { 
    public function aMethod(**Blob** $outerObject) { 
     ... 
    } 
} 

class Blob { 
    ... 
} 

,这将抛出一个致命错误。

我还想看到更多的存取关键字来定义可见性,隐藏你的班私人与'私人'等。

+0

好吧,我还没有沿着那条路走下去......类型暗示......我想我不明白它的必要性......但我会检查你留下的链接:) – johnnietheblack 2009-07-31 23:13:31

+0

刚刚阅读类型提示...我得到它 - 它锁定该参数作为我的对象,即时通讯,因为这是什么类将需要生存。在上面的例子中,它必须是类“main”的对象。谢谢! – johnnietheblack 2009-07-31 23:17:11

一本你必须要小心,以保持一个对象访问DB 的该溶液(这是不坏,你应该阅读有关的“扶养注射液”的格局,顺便说一句),是不从数据库,只要你仍然需要能够访问它
(是的,似乎很合乎逻辑的^^)

我的意思是它可能会变得容易忘记一些对象某处需要DB断开连接不被关闭。

简单的方法是永远不要断开连接 - 无论如何,PHP会在脚本结束时自动关闭与数据库服务器的连接。

绝对没有错对象传递。如果您的ClassB对象需要ClassA的实例化对象才能运行,那么您唯一的选择是在ClassB内创建该ClassA对象,或者传入ClassA。

如果可能使用ClassA对象通过多个ClassB对象,就像在你的例子中那样,然后传递ClassA(即数据库连接对象)实际上是更多有效比替代,这将涉及在每个类内创建大量重复的对象。

由于PHP5通过引用自动传递对象,所以在您的secondary类中设置引用为$mainObj实际上非常有效。

这不仅是好的,但它实际上是OOP的基石之一,它被称为aggregation