Std类是PHP中的泛型类。它出现在PHP 5中,是使用的泛型类(例如,当将值转换为对象时,它会创建一个新的StdClass实例)。
匿名类是一个一次性对象,匿名(很明显),并在PHP 7中引入.
所以他们之间有什么区别?在PHP7和更高版本中,是否还有理由在匿名类上使用StdClass?
发布于 2021-03-16 15:39:04
即使在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中的泛型类。
一个不同之处是,当您想为对象声明某些方法甚至是__construct方法时:
$object = new class('value') {
private $val;
public function __construct($val){
$this->val = $val;
}
public function getVal(){
return $this->val;
}
};对于像封装这样的面向对象的概念,上面的代码显然更具可读性。
但是,如果您需要创建一个空对象,我建议在匿名类上使用stdClass (或(object)[]来键入更少的类型),因为它的目的是派生完全建模的对象。
如果您想在对象中拥有一些公共属性,那么(object)[]仍然是一种更易读的方法:
$object = (object) [
"firstName" => "John",
"lastName" => "Doe"
];
$object = new class{};
$object->firstName = "John";
$object->lastName = "Doe";如果您需要对象的一些方法,匿名类将是一个更好的选择。
如果您想拥有私有属性,也可以使用匿名类。
如果您希望对象实现某种接口,那么一定要使用匿名类:
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;
}
});如果您希望您的对象扩展某个类,那么匿名类也是要做的事情:
$object = new class extends Thread {
public function run() {
/** ... **/
}
};
$object->start();https://stackoverflow.com/questions/66657942
复制相似问题