2015-11-03 17 views
4

我看到很多代碼,其中的調用是這樣的。如何實現這個:object-> object-> property

一個例子:

$person->head->eyes->color = "brown"; 
$person->head->size = 10; 
$person->name = "Daniel"; 

如何實現我上面寫的?

+1

嘗試閱讀這些文章: http://www.techflirt.com/tutorials/oop-in-php/php-method-chaining.html https://en.wikipedia.org/wiki/Method_chaining –

+4

@ElzoValugi,這不是方法鏈接 – swidmann

+0

@swidmann你會怎麼稱呼它? – Daniel

回答

7

這僅僅意味着$person$person->head$person->eyes各自有其他對象的屬性。 head$personeyes的財產,是$person->head的財產,依此類推。

因此,例如,當您設置$person->head->size時,您正在設置size屬性$person->head,這意味着$person->head必須是對象。換句話說,$person->head->size = 10;表示set the size property of the head property of $person to 10

示例代碼:

<?php 

class Eyes 
{ 
    var $color = null; 
} 

class Head 
{ 
    var $eyes = null; 
    var $size = null; 


    function __construct() 
    { 
     $this->eyes = new Eyes(); 
    } 
} 

class Person 
{ 
    var $head = null; 
    var $name = null; 

    function __construct() 
    { 
     $this->head = new Head(); 
    } 
} 

$person = new Person(); 
$person->head->eyes->color = "brown"; 
$person->head->size = 10; 
$person->name = "Daniel"; 

var_dump($person); 

此輸出:

class Person#1 (2) { 
    public $head => 
    class Head#2 (2) { 
    public $eyes => 
    class Eyes#3 (1) { 
     public $color => 
     string(5) "brown" 
    } 
    public $size => 
    int(10) 
    } 
    public $name => 
    string(6) "Daniel" 
} 
+0

看起來確實很好,這種做事方式有沒有名字? – Daniel

+0

實際上,即使它看起來不錯,它可以是非常混亂,不建議實踐。應該通過getter/setter方法不直接訪問屬性 –

+1

@Daniel我不認爲它有一個名字。這只是面向對象編程的一個特性,您可以將對象的屬性設置爲另一個對象。 –

-3

PHP方法chaning是祕密,回報每一個getter方法$這一

class Person 
{ 
    public function head() 
    { 
     ... 
     return $this; 
    } 

    public function eyes() 
    { 
     ... 
     return $this; 
    } 
} 

$person->head->eyes->color = "brown"; 

https://en.wikipedia.org/wiki/Method_chaining#PHP

+2

這是不完全正確的。它將是$ person-> head() - > eyes() - > color; –

+0

這不是鏈接的方法。 'head'和'eyes'不是'$ person-> head-> eyes-> color'中的方法;他們是屬性。 –

+0

我以爲這是一個普遍的問題,不是特別針對那個代碼 – mischaZeng

0

第一件事:有沒有被稱爲在您的示例方法。

答案:

這可以通過使用另一個對象實例的屬性來實現。例如:

class Head{ 
    public $size, $eyes, $etc; 
} 

class Person{ 
    public $name, $age, $head; 

    public function __construct(){ 
     $this->head = new Head(); 
    } 
} 

$person = new Person(); 
$person->head->size = 'XL'; 

這是做

您也可以施放數組作爲對象的一種方式。這將產生與數組索引的屬性stdClass的實例:

$person = array(
    'name' => 'Foo', 
    'age' => 20 
); 

$personObject = (object) $person; 
var_dump($personObject);