我是OO的新手,但我正在四处阅读,并试图学习如何做正确的事情'办法。我一直在阅读依赖注入,并且能够理解为什么它是一件好事,但我对语法并不完全清楚。
例如,在SO上查看这个Basic PHP Object Oriented Instantiation and Dependency Injection问题我会复制完全相同的代码(如答案所示的更改),然后打印出方法返回的内容:
$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;
}
如果我从我的代码中删除它没有任何中断。它只是一个人类可读的东西,以便其他人可以明确地看到存在依赖关系,或者它是否在实际使代码工作中发挥作用?
感谢您的帮助!
答案 0 :(得分:5)
它是type hint,这是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()
方法,因为$fooBar
是FooBar
的实例(因此已定义barFoo()
)。
您还可以使用typehinting强制参数为数组:
public function foo(array $bars)
{
foreach ($bars as $bar) {
// do something
}
}
正如Wilt在评论中指出的那样,PHP 7还引入了标量type declarations,这意味着您还可以强制执行标量类型(例如string
,bool
,{{1}等等。)
请注意,int
和boolean
不起作用,您必须使用简短版本(integer
和bool
)。
int