2013-08-16 87 views
4

簡單地說,讓我通過一個例子來解釋。如何動態創建一個在PHP中擴展抽象類的匿名類?

<?php 
class My extends Thread { 
    public function run() { 
     /** ... **/ 
    } 
} 
$my = new My(); 
var_dump($my->start()); 
?> 

這是從PHP手冊。

我想知道是否有辦法以更像Java的方式做到這一點。例如:

<?php 
$my = new Thread(){ 
     public function run() { 
      /** ... **/ 
     } 
     }; 
var_dump($my->start()); 
?> 
+1

不,你不能像這樣(我想有辦法用別的語法和/或結構要做到這一點,但這樣的方式 - 不) –

+0

歡迎來到PHP。它不支持這種行爲。做到這一點的唯一方法是第一種方式。 – baldrs

回答

0

您確實有權訪問ev(a | i)l。如果你使用特質來組成班級,它可能會做到這一點。

<?php 
trait Constructor { 
    public function __construct() { 
    echo __METHOD__, PHP_EOL; 
    } 
} 

trait Runner { 
    public function run() { 
    echo __METHOD__, PHP_EOL; 
    } 
} 
trait Destructor { 
    public function __destruct() { 
    echo __METHOD__, PHP_EOL; 
    } 
} 

$className = 'Thread'; 
$traits = ['Constructor','Destructor','Runner',]; 
$class = sprintf('class %s { use %s; }', $className, implode(', ', $traits)); 
eval($class); 
$thread = new $className; 
$thread->run(); 

此輸出......

Constructor::__construct 
Runner::run 
Destructor::__destruct 

這樣你就可以,但如果你不應該肯定。

1

記錄或者你可以使用命名空間。

<?php 
namespace MyName\MyProject; 
class Thread { 
    public function run(){...} 
} 
?> 


<?php 
use MyName\MyProject; 
$my = new Thread(); 

$my->run(); 
0

我知道這是一箇舊帖子,但我想指出,PHP7 has introduced anonymous classes

這將是這個樣子:

$my = new class extends Thread 
{ 
    public function run() 
    { 
     /** ... **/ 
    } 
}; 

$my->start();