Принцип инверсии зависимостей в PHP

Поскольку PHP — язык со свободной типизацией, как можно применить принцип DIP в PHP?

Практический пример будет принят с благодарностью.


person johnlemon    schedule 10.03.2011    source источник


Ответы (2)


PHP 5 представил «подсказку типа», которая позволяет функциям и методам объявлять «типизированные» параметры (объекты). В большинстве случаев портировать примеры не должно быть большой задачей, например. с Java на PHP 5.

Очень простой пример:

interface MyClient
{
  public function doSomething();
  public function doSomethingElse();
}

class MyHighLevelObject
{
  private $client;

  public __construct(MyClient $client)
  {
    $this->client = $client;
  }

  public function getStuffDone()
  {
    if ( any_self_state_check_or_whatever )
      $client->doSomething();
    else
      $client->doSomethingElse();
  }

  // ...
}

class MyDIP implements MyClient
{
  public function doSomething()
  {
    // ...
  }

  public function doSomethingElse()
  {
    // ...
  }
}
person Flinsch    schedule 10.03.2011
comment
На самом деле этот ответ не является ни полным, ни полным, ни ответом на основной вопрос. DIP не имеет ничего общего со строгой типизацией языка. - person przemo_li; 04.08.2016
comment
Это лучшее объяснение: stackoverflow.com/ вопросы/18562752/ - person chickenchilli; 10.10.2019
comment
Я думаю, это хорошо. MyHighLevelObject по праву не знает MyDIP (конкреция), только MyClient (абстракция). - person Jonny; 04.03.2021

DIP – это руководство, которое:

A. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.

Б. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Это актуально независимо от того, какие «модули» погоды на самом деле представляют собой классы, функции, модули (которые не существуют в php как таковые), черты или что-то еще.

Итак, да, вы можете использовать DIP в PHP. На самом деле вы можете использовать его в PHP даже без написания классов! Вы можете управлять зависимостями между функциями так же, как и для классов в DIP.

person przemo_li    schedule 04.08.2016