Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';这是使用Symfony';事件调度器组件?_Php_Oop_Design Patterns_Symfony1 - Fatal编程技术网

Php 什么';这是使用Symfony';事件调度器组件?

Php 什么';这是使用Symfony';事件调度器组件?,php,oop,design-patterns,symfony1,Php,Oop,Design Patterns,Symfony1,我希望通过使某些类可见来促进PHP代码中的松散耦合。Symfony看起来很有希望,SPL/对类也是如此 最好的方法是什么?我可以看到几种不同的可能性: (1) 将EventDispatcher实例注入每个可观察类(跟踪全局EventDispatcher实例): (2) 让observable类扩展EventDispatcher类: class Foo extends EventDispatcher { public function bar() { $this-&

我希望通过使某些类可见来促进PHP代码中的松散耦合。Symfony看起来很有希望,SPL/对类也是如此

最好的方法是什么?我可以看到几种不同的可能性:

(1) 将EventDispatcher实例注入每个可观察类(跟踪全局EventDispatcher实例):

(2) 让observable类扩展EventDispatcher类:

class Foo extends EventDispatcher
{
    public function bar()
    {
        $this->dispatch(...);
    }
}
(3) 使用SplObserver/SplSubject-简单明了,但不像我避免使用的EventDispatcher组件那样灵活(2)。继承可能是使用最多的模式,在这里可能不相关。选项(1)和(3)之间的选择可能取决于您的上下文。虽然避免紧耦合很好,但您应该警惕瑞士军刀解决方案。在你的应用程序中到处都有eventDispatcher,它几乎可以做任何事情,这会使你的代码更难测试/理解/维护等(它可以接近上帝对象)。另一方面,Spl解决方案要简单得多,因此如果您确实需要多个观察者/观察者,您可能会发现您必须维护太多的Spl观察者/Spl主题

与OOP中的大多数内容一样,没有最好的方法,通常取决于您的具体用例…

免责声明:此答案与Symfony EventDispatcher无关,而与您的问题有关。如果你只是想要一个答案,你可以跳过(有些)学术讨论,跳到最后

讨论 事实:增加应用程序大小意味着复杂性的一致性增加

随着应用程序范围的扩大,您会发现自己添加了越来越多的类来实现必要的功能。突然之间,要记住
Foo
对象在创建
Bar
对象时需要执行某些特定操作并不容易。此外,当您的对象开始相互提供互补功能时,在不以非常紧密耦合的对象结束的情况下维护必要的关系变得越来越困难

我们需要一种对象通信的方式,而不需要硬编码显式引用,当某些内容发生变化时,我们会忘记更改这些引用。那么,我们如何管理快速增长的对象图节点之间的这种相互关联的功能呢

如果你想让它持续下去,你得谈谈 请稍作片刻,考虑一个浪漫的比喻……< 任何关系要想持续下去,都需要持续的沟通。当然,你和你的伴侣可以在周六晚上聚在一起进行阴暗的勾搭,而在本周剩下的时间里不会互相交谈。然而,这种类型的沟通通常会导致一种脆弱的关系,即双方都不了解对方在关系中实际需要什么才能很好地发挥作用

继续类推,随着时间的推移,你的性格会慢慢改变(而且会改变),这种缺乏沟通的情况会妨碍你的伴侣理解如何最好地与你互动。最终,所有违背的承诺和错过的电话都到了紧要关头,这段关系再也不起作用了。它坏了

您的应用程序以同样的方式工作。代码应该足够成熟,可以说,“嘿,宝贝,我可能会改变,但如果我改变了,我保证我会一直让你知道我在做什么。”不幸的是,随着复杂性的增加,传统的直线应用程序设计使得如果类之间没有紧密耦合,这种通信很难维护

进入事件管理 这就是事件管理的意义所在。我们的目标是为我们的对象提供一种相互通信的方式,这种方式不会硬编码与它们需要通信的对象的关系。与大多数编程问题一样,没有一种单一的、特定的“正确”方法来解决这个问题。您的问题特别提到了实现这一点的两种可用方法,因此我将介绍它们。如果您想了解其他一些选项,@ircmaxell最近发布

观察者 在实践中,您会发现很少有用于观察者模式的真实PHP应用程序。这是因为如果你想让你的代码变得非常动态,那么你很快就会将观察者连接到所有的主题对象上

当这种情况发生时,你已经得到了你开始试图实现的松散耦合,但你已经创造了一种不同的问题:手动附加所有观察者和主题。例如,如果应用程序中的每个类都是
Logger
observer对象的主题,那么您已经为自己创建了很多工作。此外,IMHO此方法有时会将可能更准确地描述为主题的实际依赖项的内容从主题构造函数的方法签名中移出,从而使API变得模糊

如果我们在事件发生时使用集中式调度器通知感兴趣的对象,那么我们的应用程序将更加灵活,尽管观察者模式对于一次性或简单的情况来说是理想的

调解人 管理事件的一种更可靠的方法是插入一个集中的层来处理将事件分派给适当的侦听器。这就是模式(和Symfony事件调度器)所做的

中介的意义在于,它是系统中每个事件的集中中转站,因此需要在整个应用程序范围内(或者无论如何,中介部分)访问它。请注意,这并不意味着您应该将其视为一个全局变量,使用全局关键字随意访问中介,或者将其包装在某种邪恶的单例对象或静态属性/方法中。这种滥用将导致第一个答案中提出的问题。然而,我强烈反对w
class Foo extends EventDispatcher
{
    public function bar()
    {
        $this->dispatch(...);
    }
}