2011-06-22 78 views
0

我在標題中提出了一些問題,但我希望你能拿到一些示例代碼。從對象內部訪問同級對象

基本上:

在面向對象的項目,我想訪問在「父」對象中定義的對象。 考慮這個片斷:

class Bar 
{ 
    public $var; 
    public function Bar() 
    { 
     $this->var = 'value'; 
    } 
} 

class Bogus 
{ 
    public function Bogus() 
    { 
     //Here i want to access the methods and vars of obj1 in the "parent" object 
    } 
} 
class Foo 
{ 
    public $obj1,$obj2; 

    function Foo() 
    { 
     $this->obj1 = new Bar(); 
     $this->obj2 = new Bogus(); 
    } 
} 

,你可以看到「兒童」的對象是不是真的蔡爾茲在這個意義上,他們延長了「父」類,但只有對象實例化一個對象內。

有什麼「哦,該死的多數民衆贊成酷」還挺辦法做到這一點還是我必須將對象傳遞給海誓山盟 ,如:

$this->obj2 = new Bogus($this->obj1); 

或利用全局對象,instanciating外部類對象:

global $bar,$bogus; 
class Foo 
{ 
    public $obj1,$obj2; 

    function Foo() 
    { 
     global $bar,$bogus; 
     $this->obj1 = $bar = new Bar(); 
     $this->obj2 = $bogus = new Bogus(); 
    } 
} 

我希望你能理解什麼即時得到的;)

+1

'$公衆OBJ1,$ obj2的;'被認爲是不好的做法。它打敗了OOP的目的。通常,您應該使用訪問或方法(getters/setters)來訪問這些屬性,這些屬性應該是私有的或受保護的。它通過你正在做的事情傷害了封裝的概念。 – FinalForm

回答

1

我會給家長反對孩子們,也許不是通過構造函數,BU一個二傳手。如果父類被設置,那麼我們就能夠訪問它的孩子們:

/* in Bogus ... */ 

public function setParent($parent) 
{ 
    $this->parent = $parent; 
} 

public function getSiblingVar() 
{ 
    if (!empty($this->parent->obj1)) 
    { 
     return $this->parent->obj1->var; 
    } 
    return false; 
} 

/* in Foo ... */ 

$this->obj1 = new Bar(); 
$this->obj2 = new Bogus(); 
$this->obj2->setParent($this); 

我也會使用一些子對象變量的對象,那麼你可以遍歷一個對象的兄弟姐妹,他們引用父。

public function getSiblingVar($sibling_id,$var_name) 
{ 
    if (!empty($this->parent->children[$sibling_id])) 
    { 
     return $this->parent->children[$sibling_id]->getVar($var_name); 
    } 
    return false; 
} 
0

相關的那些爲同一類型,同一類,或組成不同的對象的對象一個更大的物體?

  1. 相同類型,示例嵌套在您的O.S.文件夾和文件。

  2. 不同類型,組成一個更大的項目,就像車輪,電機構成的一類汽車等