PHP7中使用匿名类的一个好例子是什么?

12

当我寻找PHP7特性时,发现了匿名类。

我不理解什么时候它们会变得有用,于是寻找一个例子。

我读了这篇文章,但我不认为这个功能有什么好处。

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

一个优点是我们不再需要命名扩展。通常,命名扩展将被隐藏在一些已包括的文件中,如果您需要查看其定义方式,您必须开始搜索它。使用匿名类,定义和对象创建位置相同。

另一方面,我认为这个匿名类的一个很大的缺点是只能在定义它的地方使用。

有人可以解释一下什么情况下这个功能有用吗?

尤其是在构建定制系统或扩展CMS(如WordPress)时是否有帮助(最好用德语,不过英语也可以)。


5
如果你需要它,语言特性是有用的。但是如果你找不到使用案例,不要仅因为它是新的和闪亮的就试图使用它。 - axiac
我认为如果您将其用作需要特定接口的函数参数,那么它会非常有用,您可以轻松地在几行代码中实现该接口。 - Koala Yeung
6
类似问题的好回答:https://dev59.com/s10Z5IYBdhLWcg3wdQEy - Tali Luvhengo
1
那就是重点。 我想知道在哪些使用情况下,此功能会变得有用。 我想不出任何例子,但也许我不像那些即使是简单任务也使用框架的人那么聪明。个人而言,我没有使用任何PHP框架,因为我还没有找到用例,而且其中许多框架(例如Symfony)需要在服务器上安装其他软件包。因此,可移植性无法保证。 - Alexander Behling
我会反过来说:当你需要它的时候,你就会知道。 - axiac
2个回答

3

匿名类在编写监听器接口的实现类时非常有用,因此您无需创建文件或通用类即可实现一次。

匿名类最优雅的地方之一是它们允许您在需要的地方定义一次性类。此外,匿名类具有简洁的语法,可以减少代码中的混乱。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/上的示例。


谢谢提供这个有趣的链接。 它对我很有帮助,因为我以前也编写过Java代码(版本1.4.*)。 实际上,在我正在处理的项目中,我无法想到任何用途。 但也许在未来,这个功能会派上用场。 - Alexander Behling
不用谢。事实上,我在 PHP 上也不常用它,但在 JavaScript 上更常见。 - Marcel Kohls
很高兴听到我不是一个人:-)在JavaScript中使用匿名类?!你能给我一个例子吗? 我只使用Lambda函数,因为我实际上使用jQuery框架。 过去我也不得不使用“令人讨厌”的框架scriptaculous。 即使在考虑在这个框架中编写事件处理程序时,我也会头痛。 - Alexander Behling
这是相同的想法,但我可以看到在js上有更多的用例。例如,基于ajax响应实例化一个类并设置特定的属性/方法:var Animal = class { constructor(name) { this.name = name; } }; - Marcel Kohls
我明白了,因此你不必加载包含类定义的文件。所以这应该会更快。 - Alexander Behling

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接