0

免责声明:您将看到的是非常规的,可能会导致中度至重度恶心。 保持开放的心态。很多人一直在询问如何做到这一点,我认为这不一定是一个糟糕的解决方案。

TL;DR -如果你熟悉vs和.你可以跳到总决赛compositioninheritancemultiple inheritance

读过一些 建议比. 我知道这通常是一种更好的方法(并且我致力于在可能的情况下使用组合),但是假设我很固执并且想要尝试多重继承。compositioninheritance

我正在尝试做的事情:

class A {}
class B {}
class AB extends A, B {} // doesn't work

实际有效的方法:

class A {}
class B extends A {}
class AB extends B {} // inherits from both A and B

我不介意这一点,但它不适用于更模块化(插件)的方法(假设您不知道类的名称)。换句话说,如果我试图创建一个允许开发人员多次扩展核心类的 OOP 框架,您必须进入并编辑类定义以从 A 扩展 B,从 B 扩展 C,然后可能重命名它回到可用的构造函数。

真正想做的是:

class DisplayBase {}
class SomePluginDisplay extends DisplayBase {}
class CrazyPluginDisplay extends SomePluginDisplay {}
// ...
class Display extends {LastPlugin}Display {}

这实际上可以通过使用

eval("class $class_name extends $parent_class_name {}");

但是,您不想将任何实际代码放入其中eval,因此您可以使用临时类名。

总决赛

见:https ://gist.github.com/beeblesox/6218135 (也贴在下面)

class Base {
    function bse(){ echo "base <br />"; }
}

/* You would have to make a dependency-based loader
 * to keep track of class names.  Here, I'm just hard
* coding to show that it could work...
*/
$parent_class = 'Base';
eval("class _BaseA extends $parent_class {}");
class BaseA extends _BaseA {
    function a(){ echo "a <br />"; }
}

$parent_class = 'BaseA';
eval("class _BaseB extends $parent_class {}");
class BaseB extends _BaseB {
    function b(){ echo "b <br />"; }
}

$parent_class = 'BaseB';
eval("class _End extends $parent_class {}");
class End extends _End {
    function nd(){ echo "end <br />"; }
}

$ab = new End();
$ab->bse(); // base
$ab->a();    // a
$ab->b();    // b
$ab->nd();  // end

注意:你不能只评估类的第一行(没有 end })。这就是我使用临时类重命名它们的原因。

这里的想法是,将有一个最终的空白类,用户将拥有一个空白类来添加他们的自定义功能。并且,最终类将覆盖和继承核心,以及任意数量的加载插件。

问题

我意识到在层次结构中有 1 或 2(或 10)个额外的类(即使其中一半是空白的)不是一个好主意。但是,我无法想象性能损失会很明显。平均页面加载量能否增加 1% 以上?

只要该eval语句不涉及用户(外部)输入,您能看到任何其他后果吗?

重申一下,我读过关于作文的帖子。 组合和接口的问题在于它们不允许您重用代码。在许多情况下,继承提供了最快、最简洁的方式来重用和修改功能,而无需重写任何内容。

4

1 回答 1

1

如果我理解正确,我认为您正在寻找PHP 5.4.0 中引入的特征

trait A {}
trait B {}
class C { use A,B; }
于 2013-08-13T06:06:31.223 回答