class 与 PHP7+ 中的匿名 class

Std class vs Anonymous class in PHP7+

Std class 是 PHP 中的通用 class。它出现在 PHP 5 中,是通用的 class 使用的(例如,将值转换为 Object 时,它会创建 a new instance of StdClass。)

匿名 class 是一次性对象,匿名(显然),并在 PHP 7.

中引入

那么它们之间有什么区别呢?在 PHP 7 及更高版本中是否仍有理由使用 StdClass 而不是 Anonymous class?

即使在 PHP 8 中,如果将数组转换为对象,您仍然会得到 stdClass:

$test = (object) [];
var_dump($test); //output: object(stdClass)#1 (0) {}

$test = new class{};
var_dump($test); //output: object(class@anonymous)#1 (0) {}

因此可以安全地假设它仍然是 php 7 和 8 中的通用 class。

一个区别是当你想为对象声明一些方法甚至 __construct 方法时:

$object = new class('value') {

    private $val;
    
    public function __construct($val){
        $this->val = $val;
    }
    
    public function getVal(){
        return $this->val;
    }
};

以上代码对于封装等面向对象的概念显然更具可读性。

但是如果您需要创建一个空对象,我建议使用 stdClass(或 (object)[] 以减少输入)而不是匿名 class,因为它旨在派生完全建模对象。

如果你想在对象中有一些 public 属性,(object)[] 仍然是一种更易读的方法:

$object = (object) [
    "firstName" => "John",
    "lastName" => "Doe"
];

$object = new class{};
$object->firstName = "John";
$object->lastName = "Doe";

如果您需要对象的某些方法,匿名 class 将是更好的选择。

如果你想拥有私人财产,同样匿名 class 是必经之路。

如果你想让你的对象实现一些接口,那么一定要使用匿名 class:

interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
         return $this->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

如果你想让你的对象扩展一些 class 然后匿名 class 是要走的路:

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

$object->start();