【问题标题】:Creating Composer Package创建 Composer 包
【发布时间】:2015-12-15 09:18:45
【问题描述】:

我正在尝试创建一个作曲家包,并且我了解创建composer.json、自动加载和在src 目录下创建类等基本工作流程。

我有一个小的编程误解是我正在阅读的几乎所有其他包都有接口和实现它们的类。我不明白在这种情况下需要接口以及为什么我们需要它们。我从未使用过接口,或者我不确定我是否了解它的一般用例。如果有人能帮助我理解它会很好。

除了我对作曲家提出的另一个问题之外,我如何在创建作曲家项目时测试/运行它?

除了我所指的这个项目之外,src 内还有一个command 目录,我也不明白这个或它的用例的重要性。我猜这与 symfony php 控制台命令有关。

在源代码中还有一个bin 目录,现在它有什么用处。

对不起,如果我在这里太天真了,但我只是想了解哪些组件落在哪里以及为什么会这样。在创建 composer.json

之后,我在网上找不到作曲家教程

【问题讨论】:

    标签: php symfony oop interface composer-php


    【解决方案1】:

    你一次问了很多问题,但我会尝试至少解决接口问题,因为我相信这是最重要的问题。

    接口主要用于Dependency Injection。他们定义方法而不真正关心方法是如何实际实现的。一个类可能依赖于一个接口而不是一个实际的(具体的)类,这允许一种简单的方法来交换组件。下面是一个如何使用接口的示例。

    interface PostsInterface {
        public function getPosts();
    }
    
    class JsonPostFetcher implements PostsInterface {
        public function getPosts() {
            // Load posts from JSON files here
        }
    }
    
    class MySqlPostFetcher implement PostsInterface {
        public function getPosts {
            // Load posts from a MySQL database
        }
    }
    
    class Blog {
        public function __construct(PostsInterface $fetcher) {
            // Load posts from either JSON or a database
            // depending on which fetcher is provided
            $posts = $fetcher->getPosts();
        }
    }
    

    使用这种方法,任何人现在都可以编写自己的代码来提供来自外部 API ApiPostFetcher、SQLite 数据库 SqlitePostFetcher、序列化 PHP 文件 SerializedPostFetcher 等的帖子。甚至可以编写一个 DymmyPostFetcher,它只返回一个可用于测试目的的预定帖子数组。然后,您可以在您的博客中使用 PostsInterface 的任何实现,如下例所示。

    $fetcher = new JsonPostFetcher(); // You can provide different fetchers here.
    $blog = new Blog($fetcher);
    

    如果您不熟悉依赖注入,我强烈建议您学习它,因为它在编写模块化代码时特别有用。

    【讨论】:

    • 那么,如果我这样做$blog = new Blog();,博客类如何知道从哪个方法调用?由于 $fetcher 来自接口,它没有任何实现。
    • 你不能打电话给new Blog();。它只会抛出一个错误,因为它期望 fetcher 参数是PostInterface 的实例。您需要致电new Blog(new JsonPostFetcher());new Blog(new MySqlPostFetcher());。我编辑了我的帖子以显示一个示例。
    • 现在说得通了。谢谢。
    猜你喜欢
    • 2016-06-25
    • 2013-09-01
    • 2020-02-15
    • 1970-01-01
    • 2014-07-16
    • 2017-01-16
    • 2018-03-04
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多