什么是匿名类?

匿名类是指没有代名标识的类,在使用时声明的类,不被在其他地方共享使用的类。简单说:一次性使用的类。

为什么要用匿名类?

  1. 压缩代码使文件更紧实、简洁
  2. 满足特殊的例外的业务功能

怎么使用匿名类?

前提:匿名类是在PHP7后增加的特性

  1. 场景:声明匿名类实现特殊功能的例外操作 比如:现在有一个日志类,它的实现是向文件写入日志信息。但业务上现在有例外需求「在某处输出到控制台日志」,这种单独的特殊需求如果增加新的实现类无疑使代码更加臃肿,所以使用匿名类的方式压缩代码。
    interface loger {
    public function log($msg);
    }
    //已存在的日志实现类
    class loger_file implements loger {
    public function log($msg) {
        file_put_contents('log.txt', $msg);
    }
    }
    //单独实现例外需求
    class test {
    public function main() {
        //这里声明了一个匿名类并重新实现了log方法
       $loger_print = new class implements loger {
           public function log($msg) {
               echo $msg;
           }
       };
        $loger_print->log('hello');
    }
    }
    (new test())->main();
  2. 场景:使用匿名类来满足不同实例需求 比如:现在有一个数据库类它实现了连接功能,但现在有某处需要连接另一个库,这种当然可以使用「多例」模式实现,但应对特殊的例外需求修改底层很不明智,这时就可以使用匿名类来实现。
    interface Connection
    {
    public function connect();
    }
    class Database
    {
    private $connection;
    public function getConnection(): Connection
    {
        return $this->connection;
    }
    public function setConnection(Connection $connection)
    {
        $this->connection = $connection;
    }
    public function checkConnection()
    {
        echo $this->connection->connect();
    }
    }
    class test
    {
    public function main()
    {
        $database = new Database();
                //这里使用匿名类重新实现连接实例
        $database->setConnection(new class implements Connection {
            public function connect()
            {
                echo 'Mysql connected';
            }
        });
        $database->checkConnection();
    }
    }
    (new test())->main();

最后

注意:上面的例子是为了说明使用方法,可能不太恰当。具体的使用场景根据需要选择。

匿名类的特性可以使我们更灵活的实现业务,且代码的整洁易读性更简单(至少不用因为各种例外情况而去追踪很多实现,最后窗口开一堆乱七八糟)。但匿名类并不是推荐的常用写法,是否使用它要看当前的业务是否需要适合,像最开始说的:它只适用于例外情况的单次使用,即“用后即丢”的情况,若不加限制的使用不止起不到它整洁简易得作用,反而会使代码更杂乱无章且不利于维护,这点需要很注意。

By 雪峰

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注