如何在PHP中使用接口和魔术方法
我想使用接口,但我的一些实现依赖于神奇的方法,如_invoke和_call。我必须从接口中删除可以神奇地(在任何实现中)调用的方法的签名。这导致了反模式的空界面(是的,我刚刚编的)如何在PHP中使用接口和魔术方法,php,interface,magic-methods,Php,Interface,Magic Methods,我想使用接口,但我的一些实现依赖于神奇的方法,如_invoke和_call。我必须从接口中删除可以神奇地(在任何实现中)调用的方法的签名。这导致了反模式的空界面(是的,我刚刚编的) 如何在PHP中组合接口和魔术方法?将实现中的所有接口方法分派到\uu call()。这涉及到很多蹩脚的剪切和粘贴工作,但它是有效的 interface Adder { public function add($x, $y); } class Calculator implements Adder {
如何在PHP中组合接口和魔术方法?将实现中的所有接口方法分派到
\uu call()
。这涉及到很多蹩脚的剪切和粘贴工作,但它是有效的
interface Adder {
public function add($x, $y);
}
class Calculator implements Adder {
public function add($x, $y) {
return $this->__call(__FUNCTION__, func_get_args());
}
public function __call($method, $args) {
...
}
}
至少每个方法的主体可以相同。;) 也许我误解了你。我试图定义一个扩展ABase并实现IA的类示例。接口方法在Base中声明为抽象,示例中只有一个_call()方法。PHP说:PHP致命错误:类ABase包含1个抽象方法,因此必须声明为抽象或实现其余方法(ABase::do_something)。好的,基本原理:父(基)有一个抽象方法。因此,任何子级都必须实现该方法。接口也是如此。因此,如果Base实现IA,并且Base将其方法的实现声明为抽象,则必须在任何子级中实现该方法。错误准确地说明了一切,因此抽象方法没有帮助。这不是一个坏主意!如果出现问题,可以通过缓存代码生成来解决锅炉板问题。根据add函数的工作方式,您可能需要添加return语句。这是否意味着magic
\u call
方法不再有用?可能只是一个名为bridge
或w/e的方法。