免责声明:您将看到的是非常规的,可能会导致中度至重度恶心。 保持开放的心态。很多人一直在询问如何做到这一点,我认为这不一定是一个糟糕的解决方案。
TL;DR -如果你熟悉vs和.你可以跳到总决赛。composition
inheritance
multiple inheritance
我读过一些 建议比. 我知道这通常是一种更好的方法(并且我致力于在可能的情况下使用组合),但是假设我很固执并且想要尝试多重继承。composition
inheritance
我正在尝试做的事情:
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
语句不涉及用户(外部)输入,您能看到任何其他后果吗?
重申一下,我读过关于作文的帖子。 组合和接口的问题在于它们不允许您重用代码。在许多情况下,继承提供了最快、最简洁的方式来重用和修改功能,而无需重写任何内容。