首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP7+中的Std类与匿名类

PHP7+中的Std类与匿名类
EN

Stack Overflow用户
提问于 2021-03-16 15:07:21
回答 1查看 440关注 0票数 1

Std类是PHP中的泛型类。它出现在PHP 5中,是使用的泛型类(例如,当将值转换为对象时,它会创建一个新的StdClass实例)。

匿名类是一个一次性对象,匿名(很明显),并在PHP 7中引入.

所以他们之间有什么区别?在PHP7和更高版本中,是否还有理由在匿名类上使用StdClass?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-16 15:39:04

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

代码语言:javascript
复制
$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方法时:

代码语言:javascript
复制
$object = new class('value') {

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

对于像封装这样的面向对象的概念,上面的代码显然更具可读性。

但是,如果您需要创建一个空对象,我建议在匿名类上使用stdClass (或(object)[]来键入更少的类型),因为它的目的是派生完全建模的对象。

如果您想在对象中拥有一些公共属性,那么(object)[]仍然是一种更易读的方法:

代码语言:javascript
复制
$object = (object) [
    "firstName" => "John",
    "lastName" => "Doe"
];

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

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

如果您想拥有私有属性,也可以使用匿名类。

如果您希望对象实现某种接口,那么一定要使用匿名类:

代码语言:javascript
复制
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;
    }
});

如果您希望您的对象扩展某个类,那么匿名类也是要做的事情:

代码语言:javascript
复制
$object = new class extends Thread {
    public function run() {
        /** ... **/
    }
};

$object->start();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66657942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档