你在這裏假設PHP執行從上到下,但它並不完全是這樣工作的:
<?php
foo(); # works
function foo(){
print "bar";
}
<?php
foo(); #dies
if($i == 1)
{
function foo(){
print "bar";
}
}
<?php
$i = 1;
if($i == 1)
{
function foo(){
print "bar";
}
}
foo(); #works
現在,雖然你可以有條件地創建類:
<?php
class A { }
class B { }
if(false){
class C extends B {
public static function bar(){
print "baz";
}
}
}
C::bar(); # dies
你不能在運行時從一個變量實例之一:
<?php
class A { }
class B { }
$x = 'B';
if(false){
class C extends $x {
public static function bar(){
print "baz";
}
}
}
C::bar();
---> Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING in /tmp/eg.php on line 7
有一種方法與評估和演示做到這一點,但你真的不想去那裏:
<?php
class A { }
class B { }
$x = 'B';
if(true){
$code =<<<EOF
class C extends $x {
public static function bar(){
print "baz";
}
}
EOF;
eval($code);
}
C::bar();
$o = new C;
if ($o instanceof $x)
{
print "WIN!\n";
}
--->barWIN!
但是,這裏還有一個更重要的問題:
爲什麼地獄會y歐想在運行時擴展不同的類使用你的代碼將要抱你下來
任何人,鞭你這一點。
(或者,如果你到鞭打,這樣做的eval伎倆)
在理想的世界裏,人們不會想要這樣做。但這不是一個理想的世界。我看了這個,因爲我堅持Joomla更改父類,以定義在1.5.x版和更高版本之間的新「元素」。我的子類不需要有所不同,我不需要不同的代碼庫,所以我希望能夠根據Joomla的版本繼承不同的類。這就是爲什麼。 – user185631 2012-07-26 16:35:21
這似乎泛型不可能與PHP,令人失望,我想這樣黑客攻擊! – 2013-05-05 02:10:45
@ user185631出於完全相同的原因來到這裏。 – mavrosxristoforos 2013-10-15 17:32:44