什么是匿名类?
匿名类是指没有代名标识的类,在使用时声明的类,不被在其他地方共享使用的类。简单说:一次性使用的类。
为什么要用匿名类?
- 压缩代码使文件更紧实、简洁
- 满足特殊的例外的业务功能
怎么使用匿名类?
前提:匿名类是在PHP7后增加的特性
- 场景:声明匿名类实现特殊功能的例外操作
比如:现在有一个日志类,它的实现是向文件写入日志信息。但业务上现在有例外需求「在某处输出到控制台日志」,这种单独的特殊需求如果增加新的实现类无疑使代码更加臃肿,所以使用匿名类的方式压缩代码。
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();
- 场景:使用匿名类来满足不同实例需求
比如:现在有一个数据库类它实现了连接功能,但现在有某处需要连接另一个库,这种当然可以使用「多例」模式实现,但应对特殊的例外需求修改底层很不明智,这时就可以使用匿名类来实现。
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();
最后
注意:上面的例子是为了说明使用方法,可能不太恰当。具体的使用场景根据需要选择。
匿名类的特性可以使我们更灵活的实现业务,且代码的整洁易读性更简单(至少不用因为各种例外情况而去追踪很多实现,最后窗口开一堆乱七八糟)。但匿名类并不是推荐的常用写法,是否使用它要看当前的业务是否需要适合,像最开始说的:它只适用于例外情况的单次使用,即“用后即丢”的情况,若不加限制的使用不止起不到它整洁简易得作用,反而会使代码更杂乱无章且不利于维护,这点需要很注意。