PHP 7 中的匿名 类
Anonymous classes in PHP 7
我在哪里可以使用以及我应该使用 PHP 7 中提供的匿名 类?我找不到它们的用例。
$message = (new class() implements Message {
public function getText() { return "Message"; }});
您可以在提供 RFC 的地方找到您正在寻找的信息 here。
"Use cases" 部分的要点如下:
- 模拟测试变得轻而易举。为接口创建即时实现,避免使用复杂的模拟 API。
- 将这些 类 的使用保持在它们在
中定义的范围之外
- 避免在琐碎的实现中使用自动加载器
匿名 classes 与 PHP 中的常规 classes 没有区别,除了它们需要同时创建和实例化 time.That 意味着它们可以扩展来自其他 classes,可以使用接口等
如果您认为您需要一个非常简单的 class 并且永远不会在其他任何地方再次使用它,那么它适合您。另一个原因可能是您需要一个简单的 class(具有多种简单方法)并且您不想花时间在文档上,所以您在旅途中创建一个来完成您的任务。
我可以提供的好案例是提供仅使用一次的上下文特定侦听器或外部侦听器的适配器,而无需定义自定义 class。这是一个例子:
$this-apiCaller->call('api_name', $parameters, new class($businessListener) implements ApiListenerInterface
{
private $listener;
public function __construct($originalListener)
{
$this->listener = $originalListener;
}
public function onSuccess($result)
{
$this->listener->addLog(new SuccessRecord($result));
}
public function onFailure($error)
{
$this->listener->addLog(new ErrorRecord($error));
}
});
正如 Rasmus Lerdorf 在 WeAreDevelopers See website 中所说的那样,当他谈到 PHP7 中的新功能时:
(在 YouTube 上观看)
Anonymous classes, just like anonymous functions; basically you can spin up classes on-the-fly and throw them away. Personally, I've never had a use for this, but there are framework folks that say that this is important. I'm still a little bit dubious, but it was easy to implement; and people smarter than me have said "Yeah, yeah, it's useful"! OK!
编辑
考虑到 Lerdorf 先生的上述引述,匿名 classes 并不意味着真的没用。
例如,通过同时定义和实例化 class,它对某种单例模式很有用。
或者,另一个例子是用它实现嵌套classes。是的,这是可能的。有关详细信息,请参阅 my answer here。
我还发现这在编写 traits 单元测试时很有用,这样你就可以只测试 trait 方法,即:
trait MyTrait
{
public method foo(): string
{
return 'foo';
}
}
...
public function setUp(): void
{
$this->testObject = (new class() {
use MyTrait;
});
}
public function testFoo(): void
{
$this->assertEquals('foo', $this->testObject->foo());
}
我在哪里可以使用以及我应该使用 PHP 7 中提供的匿名 类?我找不到它们的用例。
$message = (new class() implements Message {
public function getText() { return "Message"; }});
您可以在提供 RFC 的地方找到您正在寻找的信息 here。
"Use cases" 部分的要点如下:
- 模拟测试变得轻而易举。为接口创建即时实现,避免使用复杂的模拟 API。
- 将这些 类 的使用保持在它们在 中定义的范围之外
- 避免在琐碎的实现中使用自动加载器
匿名 classes 与 PHP 中的常规 classes 没有区别,除了它们需要同时创建和实例化 time.That 意味着它们可以扩展来自其他 classes,可以使用接口等
如果您认为您需要一个非常简单的 class 并且永远不会在其他任何地方再次使用它,那么它适合您。另一个原因可能是您需要一个简单的 class(具有多种简单方法)并且您不想花时间在文档上,所以您在旅途中创建一个来完成您的任务。
我可以提供的好案例是提供仅使用一次的上下文特定侦听器或外部侦听器的适配器,而无需定义自定义 class。这是一个例子:
$this-apiCaller->call('api_name', $parameters, new class($businessListener) implements ApiListenerInterface
{
private $listener;
public function __construct($originalListener)
{
$this->listener = $originalListener;
}
public function onSuccess($result)
{
$this->listener->addLog(new SuccessRecord($result));
}
public function onFailure($error)
{
$this->listener->addLog(new ErrorRecord($error));
}
});
正如 Rasmus Lerdorf 在 WeAreDevelopers See website 中所说的那样,当他谈到 PHP7 中的新功能时:
(在 YouTube 上观看)
Anonymous classes, just like anonymous functions; basically you can spin up classes on-the-fly and throw them away. Personally, I've never had a use for this, but there are framework folks that say that this is important. I'm still a little bit dubious, but it was easy to implement; and people smarter than me have said "Yeah, yeah, it's useful"! OK!
编辑
考虑到 Lerdorf 先生的上述引述,匿名 classes 并不意味着真的没用。
例如,通过同时定义和实例化 class,它对某种单例模式很有用。
或者,另一个例子是用它实现嵌套classes。是的,这是可能的。有关详细信息,请参阅 my answer here。
我还发现这在编写 traits 单元测试时很有用,这样你就可以只测试 trait 方法,即:
trait MyTrait
{
public method foo(): string
{
return 'foo';
}
}
...
public function setUp(): void
{
$this->testObject = (new class() {
use MyTrait;
});
}
public function testFoo(): void
{
$this->assertEquals('foo', $this->testObject->foo());
}