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

Stu*_*own 3 php oop dependency-injection

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

例如,在SO上查看这个基于面向PHP的面向对象的实例化和依赖注入问题我会复制完全相同的代码(如答案所示的更改),然后打印出方法返回的内容:

    $author = new Author('Mickey', 'Mouse');
print $author->getFirstName();

$question = new Question('what day is it?', $author);
print $question->getQuestion(); 
Run Code Online (Sandbox Code Playgroud)

但是我不清楚类名扮演的角色:

    public function __construct($question, Author $author)
{
    $this->author = $author;
    $this->question = $question;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

Nic*_*tel 5

这是一个类型提示,这是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
    }
}
Run Code Online (Sandbox Code Playgroud)

因为这使您可以强制参数类型,所以可以确保它具有特定的接口.在上面的示例中,您可以安全地使用该barFoo()方法,因为它$fooBarFooBar(并因此已barFoo()定义)的实例.

您还可以使用typehinting强制参数是一个数组:

public function foo(array $bars)
{
    foreach ($bars as $bar) {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

作为威尔特在注释中指出,PHP 7还引入了标量类型声明,这意味着也可以强制执行标量类型(如string,bool,int等)

请注意,boolean并且integer不起作用,您将不得不使用短版本(boolint).

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

}
Run Code Online (Sandbox Code Playgroud)

  • @StuartBrown只是为了完成答案:type-hinting与直接依赖注入无关.它只是PHP的一个特性.做DI时很有用.但没有直接关系. (2认同)
  • 你最后一个例子; 在PHP 7中,这成为可能.阅读PHP 7中"标量类型声明"的更多信息**[在wiki.php.net上](https://wiki.php.net/rfc/scalar_type_hints_v5)** (2认同)