PHP OOP中依赖注入,类型提示和组合的区别

时间:2017-02-23 09:01:33

标签: php oop

我正在尝试学习PHP OOP的概念,并且我已经观看了很多关于该主题的视频。在其中许多中他们展示了这样的例子:

class Person
{
    private $name;
    private $age;
    function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

}

class Business
{
    private $person;

    function __construct(Person $person)
    {
        $this->person = $person;
    }
}

所以问题在于,有一次他们称之为依赖注入,其他时候他们会调用 它类型提示和第三次他们作为组成。那么这个例子到底代表什么呢?你能解释一下它们之间的区别吗?

2 个答案:

答案 0 :(得分:1)

这是三件不同的事情:

类型提示是其他两个方面的工具,包括在声明中输入参数:

function cluefull(\Type $instance) {
    // I know that $instance is of \Type, I can safely use \Type methods on $instance
}

依赖注入依赖于构造函数来定义对象生存期和正确执行所需的所有依赖关系。 Somewhat related talk about dependency injection

class Foo {
    private $instance;
    public function __construct(\Type $instance) {
        $this->instance = $instance;
    }
}

组合是一种设计方向,如果可能的话,它与运行所需的实例组合而不是从它们继承。因此,它依赖于依赖注入和类型提示。 More reading on composition

答案 1 :(得分:-1)

依赖注入为您的应用程序提供了所需的功能,即任何数据。大多数应用程序都是模块化的,它们的行为类似于separte组件或实体。但是所有人都需要接受一些功能。

所以,他们需要的是他们的依赖性。

这可以通过类构造函数传递,这是理想的,因为初始化对象时,构造函数是第一个被调用的函数,因此您的应用程序需要工作的任何东西都可以通过构造函数传递。但有时您可以将数据直接传递给方法作为函数/方法的参数Ex:

# Generic Input validator
class InputValidator{
    function isEmailValid($email){}
}

# Our main application 
class UserRegistration(){
    function Register($inputValidator){
        $isEmailValid = $inputValidator->isEmailValid('foo@bar.com'); 
    }
}

# Instanciating the class and providing the dependancy
(new UserRegistration)->Register(new InputValidator()); 

在上面的示例中,UserRegistration->Register()依赖于类InputValidator()来注册用户,我们可以直接在UserRegistration类中提供电子邮件验证程序,但我们选择通过它作为一种依赖,而是使我们的应用程序整体S.O.L.I.D兼容。

因此,简而言之,我们在那里注入了依赖性。这是依赖注入。

Type Hinting更容易理解。

基本上,如果我们扩展前面的示例,如果您检查Register(new InputValidator());,您可以看到我们通过了它 它需要运行的类,但有人错误地也可能传递另一个类甚至是一个字符串,例如:Register('something');会破坏应用程序,因为 方法Register不需要字符串。为了防止这种情况,我们可以输入提示,换句话说,告诉Register函数只接受 某些类型的数据:array,object,int ...或者我们甚至可以通过提供类名来明确告知它采用类名称

$InputValidator = new InputValidator(); 
Register(InputValidator $InputValidator);

至于作文,这是一个更好的阅读,我可以提供What is composition as it relates to object oriented design?