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