2011-11-01 107 views
3

我想获取现有对象的实例。我如何做到这一点,而不必将对象作为参数传递?这是我现在在做什么:PHP OOP - 将对象的实例获取到另一个类

class clas1 { 
    public $myArray; 

    public function setArray($a){ 
     $this->myArray = $a; 
    } 
} 

class clas2 { 
    public $test; 

    function __construct($obj) { 
     $this->test = $obj; 
    } 
} 

$c = new clas1; 
$c->setArray(array('firstname'=>'Fred')); 

$c2 = new clas2($c); 

var_dump($c2); 

的var_dump的输出是:

object(clas2)[2] 
    public 'test' => 
    object(clas1)[1] 
     public 'myArray' => 
     array 
      'firstname' => string 'Fred' (length=4) 

我想我可以有每个对象的父对象的属性,但是否有任何其他建议?

+3

什么是错的这种方式?根据您需要对clas1实例执行的实际操作,您可能需要也可能不需要在clas2属性中存储实例的链接。 –

+3

你现在这样做的方式被称为依赖注入(http://en.wikipedia.org/wiki/Dependency_injection),实际上往往是首选的方法。 –

+0

我希望能够使用这些方法并访问属性的当前值。有没有办法通过做像$ test =&new $ clas1这样的东西来获得现有的实例?像获得参考?请原谅我的无知......我只是把我的头转向OOP。看起来“笨重”必须通过对象。 – Owen

回答

2

通过调用静态方法(如在单身)拉的对象是一个不好的做法(甚至是反模式)。对于新手来说,单身和静态类感觉很自然,因为它们的工作方式与我们在过程范式中学习的方式相同,但是您应该避免它们(只有在没有状态时才使用静态类)

您应该完全传递该对象作为参数,以避免引入隐式依赖,并做好OOP。

阅读关于依赖注入

如果对象的创建变得复杂和烦恼,你可以随时使用Dependency Injection Container

0

你应该使用sigleton模式:

class class1 
{ 
    private static $_instance; 
    public static function getInstance() 
    { 
     if (is_null(self::$_instance)) { 
      self::$_instance = new self; 
     } 
     return self::$_instance; 
    } 
    private function __construct() {} 
    private function __clone() {} 
} 

class class2 { 
    public function __construct() 
    { 
     $obj = class1::getInstance(); 
    } 
} 

$a = class1::getInstance(); 
$b = new class2(); 
+1

欧文没有说任何关于需要只有一个clas1的例子 –

+0

这个解决方案匹配我想要实现的。 – Owen

+0

空__construct()和__close()函数的原因是什么? – Owen

相关问题