当我寻找新的PHP7-features时,我偶然发现了匿名课程。
我不明白他们何时应该变得有用,并寻找一个例子。
我读了this article,但我没有看到这个功能的好处。
在结论之前的最后一节中,他们写了以下关于优点的内容:
一个优点是我们不再需要命名扩展。通常,命名扩展名将隐藏在某些包含的文件中,如果您需要查看它是如何定义的,则必须开始搜索它。对于匿名类,定义与创建对象的位置相同。
另一方面,我看到一个很大的缺点,因为你只能在它定义的地方使用这个匿名类。
有人可以解释这个功能何时有用?
特别是如果它可以帮助构建自定义系统或扩展像WordPress的CMS(最好是德语,尽管英语也很受欢迎)。
在为侦听器接口编写实现类时,匿名类可能很有用,因此您不需要创建文件或通用类只需实现一次。
匿名类最优雅的一点是它们允许您在需要的地方准确定义一次性类。此外,匿名类具有简洁的语法,可以减少代码中的混乱。 Java in a nutshell
因此,您可以拥有接口的匿名实现,甚至可以使用其他属性或覆盖方法扩展类。
例:
return new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
};
另一种情况:
提供适配器类的简单实现。适配器类是定义由某个其他对象调用的代码的类。例如,在一个名为list()
的类中使用File
方法。此方法列出目录中的文件。但是,在它返回列表之前,它会将每个文件的名称传递给您必须提供的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文件加载此文件(这是一个坏主意)。如果您在配置文件中将这些类编码为匿名类,那么您已经删除了一个包含而不会丢失维护的类。