2014-01-18 129 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 *。如果它是一条蛇,它会咬我的脸。感谢您指出了这一点。 –