理解PHP中的依赖注入

理解PHP中的依赖注入,php,oop,Php,Oop,类作者被注入到问题类的构造函数中,我是否正确?但是如何调用问题类来获取作者的姓名呢 class Author { private $firstName; private $lastName; public function __construct($firstName, $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; }

类作者被注入到问题类的构造函数中,我是否正确?但是如何调用问题类来获取作者的姓名呢

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;
    }
}

像这样?我假设Question类继承了Author类,因此Question的实例可以使用Author类的函数?

您可以创建一个新方法:

$question = new Question('What is PHP', 'Adam');
$question->getFirstname;
或者,如果您并不真正关心或觉得它不适用:

class Question 
{
    // ...
    function getAuthorFirstname()
    {
        return $this->author->getFirstname();
    }
}

$question = new Question(.., new Author(..., ...));
echo $question->getAuthorFirstname();

最终,这一切都归结为在信息隐藏和实用主义之间取得平衡。

您可以创建一种新方法:

$question = new Question('What is PHP', 'Adam');
$question->getFirstname;
或者,如果您并不真正关心或觉得它不适用:

class Question 
{
    // ...
    function getAuthorFirstname()
    {
        return $this->author->getFirstname();
    }
}

$question = new Question(.., new Author(..., ...));
echo $question->getAuthorFirstname();
归根结底,这一切都归结为在信息隐藏和实用主义之间取得平衡。

Simple

$question = new Question(.., new Author(..., ...));
echo $question->getAuthor()->getFirstname();
如果有帮助的话,请这样想

echo $question->getAuthor()->getFirstName();
还要注意,不能用字符串“Adam”构造
问题
,需要传递
作者的实例

$author = $question->getAuthor();
echo $author->getFirstName();
简单的

如果有帮助的话,请这样想

echo $question->getAuthor()->getFirstName();
还要注意,不能用字符串“Adam”构造
问题
,需要传递
作者的实例

$author = $question->getAuthor();
echo $author->getFirstName();

啊,这是链接的方法,对吗?那么我调用getFirstname的代码是错误的?如果我不想改变我的问题类中的任何内容怎么办?这真的违反了LoD吗
getAuthor()
返回
Author
实例,因此在这一点上,我们没有
Question
事实上,使用
getAuthorFirstName
示例意味着
Question
知道
Author
getAuthor()
只返回类型
Author
的值。我没有看到LoD指定只能返回基元类型。“展开”所有复杂类型并提供对其基本值的直接访问方法没有多大意义,这只会增加复杂性和依赖性如果希望完全隐藏内部实现,并且不将
作者
对象的知识传播到此类之外。但是,如果一个
问题
对象的消费者期望知道
作者
类型,那么以增加复杂性为代价隐藏它是没有意义的。啊,这是方法链接对吗?那么我调用getFirstname的代码是错误的?如果我不想改变我的问题类中的任何内容怎么办?这真的违反了LoD吗
getAuthor()
返回
Author
实例,因此在这一点上,我们没有
Question
事实上,使用
getAuthorFirstName
示例意味着
Question
知道
Author
getAuthor()
只返回类型
Author
的值。我没有看到LoD指定只能返回基元类型。“展开”所有复杂类型并提供对其基本值的直接访问方法没有多大意义,这只会增加复杂性和依赖性如果希望完全隐藏内部实现,并且不将
作者
对象的知识传播到此类之外。但是,如果一个
问题
对象的消费者期望知道
作者
类型,那么以增加复杂性为代价隐藏它是没有意义的。那么最终结果会是这样的$问题=新问题(‘什么是PHP’、新作者(‘亚当’、‘姓’);echo$question->getAuthor()->getFirstName()@詹姆斯·勒布朗:是的。您还可以预先构造author,例如
$author=newauthor('Foo','Bar')$q=新问题('Eh?',$作者)getAuthor()->getFirstName()@杰姆斯勒布朗是的。您还可以预先构造author,例如
$author=newauthor('Foo','Bar')$q=新问题('Eh?',$作者)