- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我是一名 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)应称为 Audible
或 Vocal
。 “Soundable”不是一个真正的词,作者应该感到尴尬。此外,调用与接口(interface)同名的变量有点不好。
另一件事是:Laravel 的 IoC 实际上只是一个美化的服务定位器,所以它在这里不会真正帮助你。
通常,您有两种选择:
我倾向于推荐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/
我是一名优秀的程序员,十分优秀!