为什么Laravel几乎拥有所有合同/界面?

时间:2017-02-20 08:24:06

标签: php laravel laravel-5

我正在浏览Laravel的Illuminate,我注意到它几乎每个实现都有一个界面。

这是什么目的?它是否有任何当前用途,或者更多的是使框架尽可能可扩展?

1 个答案:

答案 0 :(得分:5)

在软件工程中,合同比实施更有价值。

以下是一些原因:

  1. 您可以测试依赖于接口的类,而不依赖于接口实现(它本身可能是错误的)。 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
    
  2. 您可以编写一个使用合同而无需实现的类,例如

    function dependentFunction(MyInterface $interface) {
         $interface->contractMethod(); // Assume it's there even though it's not yet implemented. 
    }
    
  3. 只有一份合同,但有多项实施。

     interface FTPUploader { /* Contract */ }
    
     class SFTPUploader implements FTPUploader { /* Method implementation */ }
     class FTPSUploader implements FTPUploader { /* Method implementation */ }
    
  4. Laravel使用其服务容器提供对最后一个的支持,如下所示:

    $app->bind(FTPUploader::class, SFTPUploader::class); 
    
    resolve(FTPUploader::class); //Gets an SFTPUploader object
    

    然后还有一个事实是它更容易记录界面,因为那里没有实际的实现,因此它们仍然可读。