我什么时候应该在PHP7中使用匿名类

Ale*_*ing 10 php anonymous-class php-7

当我寻找新的PHP7功能时,我偶然发现了匿名类.

我不明白什么时候应该变得有用.

我也读过这篇文章,但我没有看到这个功能的好处.

在结论之前的最后一节中,他们写了以下关于优点的内容:

一个优点是我们不再需要命名扩展.通常,命名扩展名将隐藏在某些包含的文件中,如果您需要查看它是如何定义的,则必须开始搜索它.对于匿名类,定义与创建对象的位置相同.

另一方面,我看到一个很大的缺点,因为你只能在它定义的地方使用这个匿名类.

当构建自定义系统或扩展像WordPress这样的CMS时,有人可以告诉我这个功能是否有用(最好是德语,尽管也欢迎英语).

Mar*_*hls 3

匿名类在编写侦听器接口的实现类时很有用,因此您不需要创建文件或泛型类来实现一次。

匿名类最优雅的事情之一是它们允许您在需要的地方准确地定义一次性类。此外,匿名类具有简洁的语法,可以减少代码中的混乱。简而言之,Java

因此,您可以拥有接口的匿名实现,甚至可以使用附加属性或覆盖方法来扩展类。

例子:

return new class(10) extends SomeClass implements SomeInterface {
    private $num;

    public function __construct($num)
    {
        $this->num = $num;
    }
};
Run Code Online (Sandbox Code Playgroud)

另一种情况:

提供适配器类的简单实现。适配器类是定义由某个其他对象调用的代码的类。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"; 
  }
});
Run Code Online (Sandbox Code Playgroud)

关于匿名类的一些很好的基本理解和使用可以在 Java 上找到(我知道它不是PHP,但它有助于理解)示例,网址为https://www.geeksforgeeks.org/anonymous-inner-class-java/