如何不使用继承扩展类

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.1,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

如何不使用继承扩展类

要允许多个类向另一个类添加方法,可以定义魔术__call ()方法中你想要扩展的类是这样的:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
喷火/ /……公共函数__call方法参数//创建一个名为foo.method_is_not_found的事件事件HandleUndefinedMethodEvent (方法参数);->调度程序->调度(“foo.method_is_not_found”事件);//没有侦听器能够处理该事件?该方法不存在如果(!事件->isProcessed ()) {异常(sprintf ('调用未定义方法%s::%s。'get_class (),方法));}//返回监听器返回值返回事件->getReturnValue ();}}

这使用了一个特殊的HandleUndefinedMethodEvent这也应该被创造出来。这是一个泛型类,每次你需要使用这种类扩展模式时都可以重用:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
使用欧宝娱乐app下载地址组件EventDispatcher事件HandleUndefinedMethodEvent扩展事件受保护的主题受保护的方法受保护的参数受保护的returnValue受保护的isProcessed公共函数__construct主题方法参数->主题=主题->方法=方法->参数=参数;}公共函数getSubject()返回->主题;}公共函数getMethod()返回->方法;}公共函数getArguments()返回->参数;}/** *设置返回值并停止通知其他监听器*/公共函数setReturnValue瓦尔->returnValue =瓦尔->isProcessed =真正的->stopPropagation ();}公共函数getReturnValue()返回->returnValue;}公共函数isProcessed()返回->isProcessed;}}

对象的侦听,创建一个类foo.method_is_not_found事件和添加该方法酒吧()

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
酒吧公共函数onFooMethodIsNotFound(HandleUndefinedMethodEvent事件//只响应对'bar'方法的调用如果“酒吧”! =事件->getMethod ()) {//允许另一个监听器处理这个未知方法返回;}// subject对象(foo实例)喷火事件->getSubject ();// bar方法参数参数事件->getArguments ();/ /……做某事//设置返回值事件->setReturnValue (someValue);}}

最后,添加新的酒吧()方法。喷火类的实例酒吧foo.method_is_not_found事件:

1 2
酒吧酒吧();调度程序->addListener (“foo.method_is_not_found”数组酒吧“onFooMethodIsNotFound”));
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。