在PHP7中使用匿名类的一个好例子

时间:2019-03-01 09:03:51

标签: php php-7 anonymous-class

在寻找新的PHP7-features时,我偶然发现了匿名类。

我不知道它们什么时候有用,并寻找一个例子。

我读了this article,但看不到此功能的好处。

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

  

一个优点是我们不再需要指定的扩展名。通常,如果需要查看扩展名的定义,则必须开始搜索该扩展名。对于匿名类,定义位于创建对象的相同位置。

另一方面,我看到一个很大的缺点,因为您只能在定义的位置使用此匿名类。

有人可以解释一下此功能何时有用吗?

特别是在构建自定义系统或扩展WordPress之类的CMS时是否有帮助(最好是德语,但也欢迎使用英语)。

2 个答案:

答案 0 :(得分:2)

匿名类对于编写侦听器接口的实现类可能很有用,因此您无需创建文件或泛型类即可实现一次。

  

关于匿名类的最优雅的事情之一是它们   允许您在需要的地方准确定义单发类。在   此外,匿名类的语法简洁,可以减少   您的代码中混乱不堪。 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"; 
  }
});

可以在PHP

上的Java示例中找到关于匿名类的一些很好的基本理解和用法(我不知道它https://www.geeksforgeeks.org/anonymous-inner-class-java/,但有助于理解)。

答案 1 :(得分:0)

只有在没有其他地方使用此类并且自第一次编码以来未更改这些类的情况下,才应使用匿名类。
因此,例如,数据库类可能是使用匿名类的候选对象,因为它只能使用一次,并且可以包含在任何其他php文件中。在大多数情况下,用于访问数据库的数据位于配置文件中。因此,当您要避免对数据库参数进行硬编码时(这是一个坏主意),应该为正在使用该数据库的每个php文件加载该文件。如果您在配置文件中将这些类编码为匿名类,那么您将消除其中的一个而不会失去维护性。

相关问题