我正在浏览Laravel的Illuminate,我注意到它几乎每个实现都有一个界面。
这是什么目的?它是否有任何当前用途,或者更多的是使框架尽可能可扩展?
答案 0 :(得分:5)
在软件工程中,合同比实施更有价值。
以下是一些原因:
您可以测试依赖于接口的类,而不依赖于接口实现(它本身可能是错误的)。 PHPUnit示例:
//Will return an object of this type with all the methods returning null. You can do more things with the mock builder as well
$mockInterface = $this->getMockBuilder("MyInterface")->getMock();
$class = new ClassWhichRequiresInterface($mockInterface);
//Test class using the mock
您可以编写一个使用合同而无需实现的类,例如
function dependentFunction(MyInterface $interface) {
$interface->contractMethod(); // Assume it's there even though it's not yet implemented.
}
只有一份合同,但有多项实施。
interface FTPUploader { /* Contract */ }
class SFTPUploader implements FTPUploader { /* Method implementation */ }
class FTPSUploader implements FTPUploader { /* Method implementation */ }
Laravel使用其服务容器提供对最后一个的支持,如下所示:
$app->bind(FTPUploader::class, SFTPUploader::class);
resolve(FTPUploader::class); //Gets an SFTPUploader object
然后还有一个事实是它更容易记录界面,因为那里没有实际的实现,因此它们仍然可读。