Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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中使用接口和魔术方法_Php_Interface_Magic Methods - Fatal编程技术网

如何在PHP中使用接口和魔术方法

如何在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 {

我想使用接口,但我的一些实现依赖于神奇的方法,如_invoke和_call。我必须从接口中删除可以神奇地(在任何实现中)调用的方法的签名。这导致了反模式的空界面(是的,我刚刚编的)


如何在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的方法。