9

简单地说,让我通过一个例子来解释。

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

4 回答 4

14

我知道这是一篇旧文章,但我想指出PHP7 引入了匿名类

它看起来像这样:

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

$my->start();
于 2017-05-23T21:49:20.463 回答
1

您确实有权访问 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

所以你可以,但不确定你是否应该。

于 2015-09-17T15:10:03.480 回答
1

Or you can just use namespaces.

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


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

$my->run();
于 2015-10-13T15:20:50.467 回答