如何扩展一个类没有使用继承
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何扩展一个类没有使用继承
允许多个类方法添加到另一个,您可以定义的魔法__call ()
方法在课堂上你想要扩展是这样的:
1 2 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。get_class (美元这),美元方法));}/ /返回侦听器返回的值返回美元事件- >getReturnValue ();}}
它使用一个特殊的HandleUndefinedMethodEvent
还应该创建的。这是一个泛型类,可以重用每次需要使用这类扩展的模式:
1 2 3 4 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
使用ob娱乐下载\组件\EventDispatcher\事件;类HandleUndefinedMethodEvent扩展事件{受保护的美元主题;受保护的美元方法;受保护的美元参数;受保护的美元returnValue;受保护的美元isProcessed=假;公共函数__construct(美元主题,美元方法,美元参数){美元这- >主题=美元主题;美元这- >方法=美元方法;美元这- >参数=美元参数;}公共函数getSubject(){返回美元这- >主题;}公共函数getMethod(){返回美元这- >方法;}公共函数getArguments(){返回美元这- >参数;}/ * * *集值返回,阻止其他听众被通知* /公共函数setReturnValue(美元瓦尔){美元这- >returnValue =美元瓦尔;美元这- >isProcessed =真正的;美元这- >stopPropagation ();}公共函数getReturnValue(){返回美元这- >returnValue;}公共函数isProcessed(){返回美元这- >isProcessed;}}
接下来,创建一个类,它将会听foo.method_is_not_found
事件和添加该方法酒吧()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
类酒吧{公共函数onFooMethodIsNotFound(HandleUndefinedMethodEvent美元事件){/ /只响应调用“酒吧”的方法如果(“酒吧”! =美元事件- >getMethod ()) {/ /允许另一个侦听器来照顾这未知的方法返回;}/ / subject对象(foo实例)美元喷火=美元事件- >getSubject ();/ /方法参数美元参数=美元事件- >getArguments ();/ /……做某事/ /设置返回值美元事件- >setReturnValue (美元someValue);}}
最后,添加新的酒吧
方法喷火
通过注册类的一个实例酒吧
与foo.method_is_not_found
事件:
1 2
美元酒吧=新酒吧();美元调度程序- >addListener (“foo.method_is_not_found”,数组(美元酒吧,“onFooMethodIsNotFound”));
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。