匿名类在编写监听器接口的实现类时非常有用,因此您无需创建文件或通用类即可实现一次。
匿名类最优雅的地方之一是它们允许您在需要的地方定义一次性类。此外,匿名类具有简洁的语法,可以减少代码中的混乱。Java in a nutshell
因此,您可以使用匿名接口实现甚至扩展类,具有其他属性或重写的方法。
示例:
return new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
};
另一种情况:
提供一个简单的适配器类实现。适配器类是定义由某些其他对象调用的代码的类。例如,考虑名为File
的类上的list()
方法。该方法列出目录中的文件。在返回列表之前,它将每个文件的名称传递给必须提供的FilenameFilter
对象。这个FilenameFilter
对象接受或拒绝每个文件。当你实现FilenameFilter
接口时,你正在为与$file->list()
方法一起使用的适配器类定义。由于这样一个类的主体通常非常短,因此很容易将适配器类定义为匿名类。
$file = new File("/src");
// Now call the list() method with a single FilenameFilter argument
// Define and instantiate an anonymous implementation of FilenameFilter
// as part of the method invocation expression.
$filelist = $file->list(new class extends FilenameFilterClass {
public function accept(File $f, string $otherInfo) {
return pathinfo($f, PATHINFO_EXTENSION) === ".php";
}
});
在Java中可以找到一些关于匿名类的基本理解和使用方法(我知道它不是PHP,但这有助于理解),例如在https://www.geeksforgeeks.org/anonymous-inner-class-java/上的示例。
只有在这个类没有被其他地方使用并且自从第一次编码以来这个类没有被更改,我才应该使用匿名类。
例如,数据库类可能是使用匿名类的候选对象,因为它只应该使用一次,并且可以包含在任何其他PHP文件中。在大多数情况下,访问数据库的数据都在配置文件中。因此,当您想要避免硬编码数据库参数(这是一个坏主意)时,应该为使用数据库的每个PHP文件加载此文件。如果您将这些类编码为配置文件中的匿名类,则可以消除一个include而不失去维护性。