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

use*_*290 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,有一次他们将其称为“依赖注入”,其他时候他们将其称为“类型提示”,第三次他们将其称为“组合”。那么这个例子到底代表什么呢?您能解释一下它们之间的区别吗?

Fél*_*ier 7

这是三个不同的事情:

类型提示对其他两个很有帮助,包括在声明中键入参数:

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

依赖注入依赖构造函数来定义对象生命周期和正确执行所需的所有依赖项。与依赖注入有些相关的讨论

class Foo {
    private $instance;
    public function __construct(\Type $instance) {
        $this->instance = $instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

组合是一种设计方向,如果可能的话,组合它需要操作的实例,而不是继承它们。因此,它依赖于依赖注入和类型提示。更多关于作文的阅读


sam*_*ayo -2

依赖注入为您的应用程序提供其运行所需的内容,即任何数据。大多数应用程序都是模块化的,它们的行为就像单独的组件或实体。但所有人都需要吸收一些东西才能发挥作用。

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

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

# 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()); 
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,UserRegistration->Register()依赖于类InputValidator()来注册用户,我们可以直接在UserRegistration类中提供电子邮件验证器,但我们选择将其作为依赖项传递,而不是使我们的应用程序作为一个整体符合SOLID标准。

所以,简而言之,我们正在那里注入依赖关系。这就是依赖注入。

类型提示更容易理解。

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

$InputValidator = new InputValidator(); 
Register(InputValidator $InputValidator);
Run Code Online (Sandbox Code Playgroud)

至于组合,这是一本更好的读物,我可以提供什么是组合,因为它与面向对象设计相关?