[英]How to dynamically create an anonymous class that extends an abstract class in PHP?
Simply, let me explain by an example. 简单地说,让我通过一个例子来解释。
<?php
class My extends Thread {
public function run() {
/** ... **/
}
}
$my = new My();
var_dump($my->start());
?>
This is from PHP manual. 这是来自PHP手册。
I am wondering if there is a way to do this in more Java-like fashion. 我想知道是否有办法以更像Java的方式做到这一点。 For example:
例如:
<?php
$my = new Thread(){
public function run() {
/** ... **/
}
};
var_dump($my->start());
?>
I know this is an old post, but I'd like to point out that PHP7 has introduced anonymous classes . 我知道这是一个老帖子,但我想指出PHP7引入了匿名类 。
It would look something like this: 它看起来像这样:
$my = new class extends Thread
{
public function run()
{
/** ... **/
}
};
$my->start();
Or you can just use namespaces. 或者你可以只使用命名空间。
<?php
namespace MyName\MyProject;
class Thread {
public function run(){...}
}
?>
<?php
use MyName\MyProject;
$my = new Thread();
$my->run();
You do have access ev(a|i)l. 你有访问ev(a | i)l。 If you used traits to compose your class it COULD be possible to do this.
如果你使用特征来组成你的课程,那么它可以做到这一点。
<?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();
This outputs ... 这输出......
Constructor::__construct
Runner::run
Destructor::__destruct
So you CAN, but not sure if you SHOULD. 所以你可以,但不确定你是不是应该。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.