gpt4 book ai didi

php - 如何在 PHP 中自动绑定(bind)实现?

转载 作者:搜寻专家 更新时间:2023-10-31 21:02:30 25 4
gpt4 key购买 nike

所以我是一名 Laravel 开发人员,尽管我已经使用它一段时间了,而且我喜欢表面下发生的魔法,它如何在通过 IoC 容器实例化类时自动绑定(bind)实现,现在我是尝试了解设计模式的基础知识并了解事物的实际工作原理。

所以我从 Animal 示例开始:

abstract class Animal
{
abstract function makeSound();
}

class Dog extends Animal
{
public function makeSound()
{
echo "Bark!\n";
}
}

class Cat extends Animal
{
public function makeSound()
{
echo "Bark!\n";
}
}

所以我正在阅读 Head First Design Patterns 并且我正在尝试充分利用这本书。此时,每次我创建一个新的 Animal 时,我都必须执行 make sound 方法,这在大多数情况下会有所不同。

所以这本书告诉我应该编写一个 Soundable 接口(interface),然后在 Animal 扩展类中实现该接口(interface)。

我终于想到了这样的事情:

interface Soundable
{
function sound();
}

class Bark implements Soundable
{
public function sound()
{
return "Bark!\n";
}
}

class Meow implements Soundable
{
public function sound()
{
return "Meow!\n";
}
}

class Animal
{
public $soundable;

public function __construct(Soundable $soundable)
{
$this->soundable = $soundable;
}

public function makeSound()
{
echo $this->soundable->sound();
}
}

class Dog extends Animal
{

}

class Cat extends Animal
{

}

function makeAnimal(Animal $animal){
return $animal;
}

// Making a dog
$animal = makeAnimal(new Dog(new Bark()));
$animal->makeSound();

// Making a cat
$animal = makeAnimal(new Cat(new Meow()));
$animal->makeSound();

因此,现在当我有另一种会吠叫或喵喵叫的动物时,我可以在制作动物时简单地实例化该实现。

现在我的问题是如何告诉 PHP 在实例化 Dog 类时自动传递 new Bark() 因为它会吠叫而我不想每次我实例化一个新的 Dog 对象时都写它。

那么我如何使用 Laravel 用来在实例化 Dog 时自动传递 Bark 对象的类似魔法。

PS:我还在学习,所以在理解这些原则的同时,我可能会完全走错方向。如果您更了解,请指导我。

最佳答案

首先小提示:书错。该接口(interface)应称为 AudibleVocal。 “Soundable”不是一个真正的词,作者应该感到尴尬。此外,调用与接口(interface)同名的变量有点不好。

另一件事是:Laravel 的 IoC 实际上只是一个美化的服务定位器,所以它在这里不会真正帮助你。

通常,您有两种选择:

  • 使用工厂(在这种特殊情况下会很痛苦和/或棘手)
  • 使用依赖注入(inject)容器——最好是基于反射的容器

我倾向于推荐Auryn在这些情况下。但是,如果您愿意多跳几圈并忍受有限的配置,您也可以使用 Symfony's DIC .

如果您使用的是 Auryn,则您的狗和猫的初始化将只是:

$injector = new Auryn\Injector;
$dog = $injector->make('Dog');
$cat = $injector->make('Cat');

库会自行查找Dog 的构造函数的反射,并检测到它还需要创建一个新的Bark 实例。

关于php - 如何在 PHP 中自动绑定(bind)实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com