PHP依赖注入——在构造函数中包含类名


PHP Dependency Injection - Including Class name in constructor

我是OO的新手,但我正在阅读并试图学习以"正确"的方式做事。我一直在阅读依赖注入,并且可以理解为什么它是一件好事,但是我不完全清楚语法。

例如,看看这个基本的PHP面向对象的实例化和依赖注入问题,我复制了完全相同的代码(根据答案所建议的更改),然后打印出方法返回的内容:

    $author = new Author('Mickey', 'Mouse');
print $author->getFirstName();
$question = new Question('what day is it?', $author);
print $question->getQuestion(); 

但是我不清楚类名在以下方面的作用:

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

如果我从我的代码中删除它,没有什么破坏。它只是一个人类可读的东西,以便其他人可以明确地看到存在依赖关系,还是它在实际使代码工作中发挥作用?

谢谢你的帮助!

这是一个类型提示,这是PHP 5的一个特性。如果键入提示参数(通过在其前面加上类名),则强制该参数为该类型的对象。(它不一定是那个类的实例,也可以是子类的实例)

类型甚至不一定是一个类:你也可以使用interface来提示类型。

请参阅PHP文档中的这个(稍微修改过的)示例:

<?php
class MyClass
{
    /**
     * $fooBar must be an instance of FooBar (or a subclass of FooBar).
     */
    public function foo(FooBar $fooBar)
    {
        // because we know that we have an instance of FooBar, we can use it's method barFoo()
        $fooBar->barFoo();
    }
}
class FooBar
{
    public function barFoo()
    {
        // do something
    }
}

因为这使您能够强制参数的类型,所以您可以确保它具有特定的接口。在上面的例子中,您可以安全地使用barFoo()方法,因为$fooBarFooBar的一个实例(因此定义了barFoo())。

还可以使用类型提示强制参数为数组:

public function foo(array $bars)
{
    foreach ($bars as $bar) {
        // do something
    }
}

正如Wilt在评论中指出的那样,PHP 7还引入了标量类型声明,这意味着您也可以强制执行标量类型(如string, bool, int等)

注意booleaninteger不能工作,你必须使用简短的版本(boolint)。

// not possible:
public function bar(string $myText, int $someNumber)
{
}