2014-01-18 56 views
-1

我正在學習依賴注入在PHP中,我認爲有些東西我錯過了。PHP依賴注入 - 調用注入對象的方法

我創建了兩個班,AuthorArticle

class Author{ 
    private $firstName; 
    private $lastName; 

    public function __construct($firstName, $lastName){ 
     $this->firstName = $firstName; 
     $this->lastName = $lastName; 
    } 

    public function getName(){ 
     return $this->firstName . " " . $this->lastName; 
    } 
} 

class Article{ 
    private $author; 
    private $content; 

    public function __construct(Author $author, $content){ 
     $this->author = $author; 
     $this->content = $content; 
    } 

    public function getContent(){ 
     return $this->content; 
    } 
} 

然後,我的索引頁,我實例化我的文章類,並注入我的Author類:

require "Classes.php"; 
$Article = new Article(new Author("Chris", "Schmitz"), "this is the content of my article"); 

print_r($Article); 

打印出我的對象如預期的那樣:

Article Object ([author:Article:private] => Author Object ([firstName:Author:private] => Chris [lastName:Author:private] => Schmitz) [content:Article:private] => this is the content of my article) 

這一切都合情合理,b UT當我去從我Author類調​​用公共方法getName()我得到一個錯誤:

echo $Article->author->getName(); 
// produces php error: PHP Fatal error: Cannot access private property Article::$author 

如果我注射一個對象到另一個,我不應該能夠訪問被注入的對象的公共方法?我誤解了預計注射會如何工作?我把它設置錯了嗎?

回答

1

$authorprivateArticle的財產,這意味着您只能從該類中的方法訪問它。

雖然getName()方法確實public,該->鏈的所有部分都必須從你使用它們其中的背景下可見的 - 可惜author不是。

至於建議由哈利姆,解決錯誤的清潔方式是在你的Article類創建爲author屬性public getter方法:

public function getAuthor() { 
    return $this->author; 
} 
+0

是的,但是這將打破封裝原則。添加一個簡單的'getAuthor()'方法會更明顯,並且可以保留類中成員的封裝。 –

+0

@HalimQarroum非常真實。 –

+0

@GeorgeBrighton:啊,* facepalm *。如果它是一條蛇,它會咬我的臉。感謝您指出了這一點。 –