如何不使用继承扩展类
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐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许可证。