继承是OOP的关键元素。你不应该担心它可能对速度的影响。您可以(并且应该)喜欢组合和聚合而不是继承,但是如果您的设计需要继承,您可以使用它。其他任何事情都像是说你想不带球棒打棒球。继承是游戏的一部分。
不管怎样,这里有一点要用您最喜欢的分析器运行:
<?php error_reporting(-1); ini_set('memory_limit', '1024M');
// Create classes A to Z with each class extending the previous class
class A { public function fn() { return TRUE; } }
$previous = 'A';
foreach(range('B','Z') as $klass) {
eval(sprintf('class %s extends %s{}', $klass, $previous));
$previous = $klass;
}
// create results for non-inheriting class A
function A_is_a() { return is_a(new A, 'A'); }
function A_get_class() { return get_class(new A); }
function A_get_parent() { return get_parent_class(new A); }
function A_call_fn() { $a = new A; return $a->fn(); }
// create results for Z that inherits from Y ... that inherits from A
function Z_is_a() { return is_a(new Z, 'A'); }
function Z_get_class() { return get_class(new Z); }
function Z_get_parent() { return get_parent_class(new Z); }
function Z_call_fn() { $z = new Z; return $z->fn(); }
for($i=0;$i<10000;$i++) A_is_a();
for($i=0;$i<10000;$i++) A_get_class();
for($i=0;$i<10000;$i++) A_get_parent();
for($i=0;$i<10000;$i++) A_call_fn();
for($i=0;$i<10000;$i++) Z_is_a();
for($i=0;$i<10000;$i++) Z_get_class();
for($i=0;$i<10000;$i++) Z_get_parent();
for($i=0;$i<10000;$i++) Z_call_fn();
在我的计算机上使用php5.3.3 cli和zend调试器的结果
Function Calls Av. Own Own Time Others Total
A_is_a 10000 0,000003 0,025626 0,000000 0,025626
A_get_class 10000 0,000002 0,022033 0,000000 0,022033
A_get_parent 10000 0,000002 0,020804 0,000000 0,020804
A_call_fn 10000 0,000003 0,034949 0,012274 0,047223
Z_is_a 10000 0,000002 0,024436 0,000000 0,024436
Z_get_class 10000 0,000003 0,028833 0,000000 0,028833
Z_get_parent 10000 0,000002 0,022144 0,000000 0,022144
Z_call_fn 10000 0,000003 0,033359 0,012549 0,045908
免责声明:请注意,结果可能在您的机器上有所不同,而且还请注意,孤立的基准通常都是无意义的,尤其是在类似这样的优化时。您可以将代码更改为扩展1000个类,然后您将看到
is_a
函数调用,但说真的,如果您的任何生产代码扩展了1000个类,则会遇到更大的问题;)