Php 创建编写器包

Php 创建编写器包,php,symfony,oop,interface,composer-php,Php,Symfony,Oop,Interface,Composer Php,我正在尝试创建一个composer包&我了解创建composer.json、自动加载和在src目录下创建类等基本工作流程 我有一个小小的编程误解,那就是我正在阅读的几乎所有其他包都有接口和实现它们的类。我不理解在这种情况下对接口的需求以及我们为什么需要它们。我从未使用过这个接口,或者我不确定我是否理解它的一般用例。如果有人能帮我理解,那就太好了 除此之外,我对composer提出的另一个问题是,如何在创建composer项目的同时测试/运行它 除了我所指的这个项目之外,在src中还有一个命令目录

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

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

除此之外,我对composer提出的另一个问题是,如何在创建composer项目的同时测试/运行它

除了我所指的这个项目之外,在
src
中还有一个
命令
目录,我也不理解这个或它的用例的意义。我想这与symfonyphp控制台命令有关

在源代码中还有一个
bin
目录,这有什么用呢


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

之前,我在网上找不到composer教程。你一下子问了很多问题,但我会尝试至少解决接口问题,因为我认为这是最重要的问题

接口主要与一起使用。他们定义方法,实际上并不关心方法是如何实际实现的。一个类可能依赖于一个接口,而不是一个实际的(具体的)类,这样就可以方便地交换组件。下面是一个如何使用接口的示例

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
apippostfetcher
、SQLite数据库
SqlitePostFetcher
提供帖子,序列化PHP文件
SerializedPostFetcher
等。您甚至可以编写一个
DymmyPostFetcher
,它只返回一个可用于测试目的的预先确定的POST数组。然后,您可以在博客中使用
PostsInterface
的任何实现,如以下示例所示

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

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

如果我这样做,
$blog=new blog()博客类如何知道从哪个方法调用?由于$fetcher来自接口,所以它没有任何实现。它只会抛出一个错误,因为它希望fetcher参数是
posterface
的instance。您需要调用
newblog(newjsonpostfetcher())
新博客(新的MySqlPostFetcher())。我编辑了我的文章来展示一个例子。现在它有意义了。谢谢