2015-09-18 11 views
1

Я пытаюсь создать пакет композитора & Я понимаю основной рабочий процесс, например, создание композитора.json, автоматическую загрузку и создание классов под каталогом src.Создание пакета композитора

Существует одно небольшое недоразумение в программировании, которое у меня есть, что почти все другие пакеты, которые я читаю, имеют интерфейсы и класс, реализующий их. Я не понимаю необходимость интерфейсов в этом контексте и почему они нам нужны. Я никогда не пользовался интерфейсом, или я не уверен, понимаю ли я его общий прецедент. Было бы неплохо, если бы кто-то помог мне это понять.

Рядом с другим вопросом, который у меня был в контексте для композитора, как я могу протестировать/запустить проект композитора, пока я его создаю?

У этого проекта, который я имею в виду, есть каталог command внутри src. Я не понимаю значение этого или его прецедента. Я предполагаю, что это имеет какое-то отношение к команде symfony php console.

Также есть каталог bin в источнике, теперь как это полезно.

Извините, если я наивна здесь, но я просто пытаюсь понять, какие компоненты упадут туда и почему это так. Я не мог найти композиторский учебник онлайн после создания composer.json

ответ

2

Вы задаете сразу несколько вопросов, но я попытаюсь хотя бы адресовать интерфейсы, так как считаю, что это самый важный.

Интерфейсы в основном используются с 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 Database SqlitePostFetcher, Serialized PHP файлы SerializedPostFetcher и т.д. Можно даже написать DymmyPostFetcher, который просто возвращает pretermined массив сообщений которые могут быть использованы для целей тестирования. Затем вы можете использовать любую реализацию PostsInterface в своем блоге, как в следующем примере.

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

Если вы не знакомы с инъекцией зависимостей, я настоятельно рекомендую изучать его, так как это будет особенно полезно в письменном виде модульного кода.

+0

Так что, если я делаю '$ blog = новый блог();' как класс Blog будет знать, с какого метода звонить? Поскольку $ fetcher исходит из интерфейса, и у него нет никакой реализации. – kishanio

+1

Вы не можете позвонить 'new Blog();'. Он просто выдал бы ошибку, потому что он ожидает, что параметр fetcher станет инстансом 'PostInterface'. Вам нужно будет вызвать либо новый блог (новый JsonPostFetcher()), либо новый блог (новый MySqlPostFetcher()); '. Я редактировал свой пост, чтобы показать пример. – Cryszon

+0

Теперь это имеет смысл. Благодарю. – kishanio