PHP依赖注入

PHP依赖注入,php,dependency-injection,Php,Dependency Injection,我试图理解一个关于PHP依赖性的教程。以下是示例代码:- class Author { private $firstName; private $lastName; public function __construct($firstName, $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; } public f

我试图理解一个关于PHP依赖性的教程。以下是示例代码:-

class Author {
    private $firstName;
    private $lastName;

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

    public function getFirstName() {
        return $this->firstName;
    }

    public function getLastName() {
        return $this->lastName;
    }
}

class Question {
    private $author;
    private $question;

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

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

    public function getQuestion() {
        return $this->question;
    }
}
为了了解其工作原理,我添加了以下代码:-

$author = new Author('John', 'Doe');
$qn = new Question('What is your name?', $author);
$authorName = $qn->getAuthor();
print_r($authorName);
这给了我以下的信息:-

Author Object
(
    [firstName:Author:private] => John
    [lastName:Author:private] => Doe
)
如何访问Author对象的值,即firstName和lastName

我尝试了$authorName->firstName,但返回了一个错误

Cannot access private property Author::$firstName
正如我所说,我只是想用这个代码示例了解依赖项注入。我知道,在Author类中将$firstName类型更改为public将使其正常工作,但如果代码示例不正确或我检索值的代码不正确,则仍需要任何PHP专家的澄清


谢谢,非常感谢您的反馈

这里的范例是,对于每个“私有”字段,都有一个相应的“公共”函数来获取该字段。这就是从$qn对象获取作者的方法:通过调用
$qn->getAuthor()
,同样地,因为这会给您一个作者,并且您需要作者的名字,所以您可以使用

$author = $qn->getAuthor();
$firstname = $author->getFirstName();

依赖项注入只是要求当您提出问题时,传递给构造函数的第二个参数必须是
Author

类型。如果您想从问题类访问作者名称,可以修改getAuthor函数:

课堂问题getAuthor()

通过呼叫

$authorName = $qn->getAuthor();
print_r($authorName);
// you will get John Doe

由于Question类包含一个Author实例,因此我建议创建第三个名为
getAuthorName
的方法,而不是更改应该返回Author实例的方法。那么回到我最初的问题。。。。有没有办法让我检索作者的名字,或者是第一个,或者是最后一个,或者两者都有。。。如果不修改这两个类示例,并且只使用$qn对象?hi@asyadiqin,很遗憾,您确实需要编辑其中一个。试着实现我的答案。那也许你会有个主意?干杯。你这样称呼它有点糟糕,那;这就是为什么我在问题课上给作者打电话。就像
$question->getAuthor()
而不是
$author->getFirstName()
。对我来说,使用$author对象来检索名字和姓氏会破坏将依赖项注入添加到question类中的目的。如果这个示例类的目的是简单地展示如何实现这一点,那么就这样吧。从表面上看,我是否正确地假设,即使示例显示了依赖项注入是如何完成的,如果不在Question类本身中修改或添加方法,我无法从Question类中检索值?@asyadiqin您必须更像是在定义一个契约,该契约的
问题始终包含作者。因此,如果我使用一个
问题
实例,我总能找到它的相关作者。要真正获取firstName,您需要执行类似于
$qn->getAuthor()->getFirstName()
的操作。
$authorName = $qn->getAuthor();
print_r($authorName);
// you will get John Doe