Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中动态创建扩展抽象类的匿名类?_Php_Dynamically Generated_Anonymous Class - Fatal编程技术网

如何在PHP中动态创建扩展抽象类的匿名类?

如何在PHP中动态创建扩展抽象类的匿名类?,php,dynamically-generated,anonymous-class,Php,Dynamically Generated,Anonymous Class,简单地说,让我用一个例子来解释 <?php class My extends Thread { public function run() { /** ... **/ } } $my = new My(); var_dump($my->start()); ?> 这来自PHP手册 我想知道是否有一种更像Java的方式来实现这一点。例如: <?php $my = new Thread(){ public function

简单地说,让我用一个例子来解释

<?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());
?>

您确实可以访问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();

因此您可以,但不确定是否应该。

或者,您可以使用PHP7的匿名类功能,如和中所述,也可以只使用名称空间

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


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

$my->run();


我知道这是一篇老文章,但我想指出这一点

它看起来像这样:

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

$my->start();

不,您不能这样做(我想有其他语法和/或构造的方法可以做到这一点,但这样做-不是)欢迎使用PHP。它不支持这种行为。唯一的方法是第一种方法。从PHP7开始,这是正确的。。。来源:我写了匿名类支持和pthreads。。。
$my = new class extends Thread
{
    public function run()
    {
        /** ... **/
    }
};

$my->start();