2017-02-23 111 views
1

Я пытаюсь изучить концепции PHP OOP, и я просмотрел несколько видеороликов по этой теме. Во многих из них они показывают пример, как это:Разница между вложением зависимостей, типом намека и составом в PHP OOP

class Person 
{ 
    private $name; 
    private $age; 
    function __construct($name, $age) 
    { 
     $this->name = $name; 
     $this->age = $age; 
    } 

} 

class Business 
{ 
    private $person; 

    function __construct(Person $person) 
    { 
     $this->person = $person; 
    } 
} 

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

+1

Тип намекая: Добавление типа перед переменной в функции параметры волнолома '(Person $ человек)' – RiggsFolly

+1

зависимостях Injection: Передача объекта Person в конструктор бизнес классов – RiggsFolly

+1

В Symfony 3.3 типа намекая любой метод также обеспечивает инъекция зависимостей: т.е. предоставляет доступный глобальный сервис этому методу. Это чертовски сложно. Словения меняется повсеместно. – RichieHH

ответ

-1

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

Таким образом, они нуждаются в их зависимости.

Это может быть передано через класс-конструктор, который идеален, когда инициализируется объект, который является первой вызывающей функцией, поэтому все, что нужно для работы вашего приложения, может быть передано через конструктор. Но иногда вы можете передавать данные непосредственно к методу в качестве аргумента в вашей функции/метода Ex:

# Generic Input validator 
class InputValidator{ 
    function isEmailValid($email){} 
} 

# Our main application 
class UserRegistration(){ 
    function Register($inputValidator){ 
     $isEmailValid = $inputValidator->isEmailValid('[email protected]'); 
    } 
} 

# Instanciating the class and providing the dependancy 
(new UserRegistration)->Register(new InputValidator()); 

В приведенном выше примере, UserRegistration->Register() зависит от класса InputValidator() зарегистрировать пользователя, мы могли бы при условии, что валидатор электронной почты непосредственно в классе UserRegistration, но мы решили передать его как зависимость, вместо того чтобы сделать наше приложение в целом S.O.L.I.D совместимым.

Итак, вкратце мы вводим там зависимость. Это инъекция зависимостей.

Type Hinting есть, гораздо проще понять.

В принципе, если мы продолжим наш предыдущий пример, и если вы проверяете Register(new InputValidator()); вы можете увидеть, что мы прошли это в классе он должен работать, а кто-то по ошибке может также передать другой класс или даже строку, такие как: Register('something'); который бы разорвать приложение, поскольку Метод Register не нуждается в строке. Чтобы предотвратить это, мы можем набрать его, другими словами сообщить функции Register только для принятия определенного типа данных: array, object, int ... или мы можем даже явно сообщить ему, чтобы взять имя класса, предоставив его перед

$InputValidator = new InputValidator(); 
Register(InputValidator $InputValidator); 

, как для композиции, это лучше прочитать, что я могу предоставить What is composition as it relates to object oriented design?

+0

Кто такой нисходящий диск? – samayo

+0

Спасибо, я думаю, я понял. – user3102290

+0

Я предполагаю, что у человека возникла проблема с этой строкой: «Register (InputValidator $ InputValidator);» – RichieHH

1

это три разные вещи:

Тип намекая играет важную роль двух других и состоит из печатая аргумент i п декларация:

function cluefull(\Type $instance) { 
    // I know that $instance is of \Type, I can safely use \Type methods on $instance 
} 

Dependency Injection полагается на конструктор для определения всех зависимостей, необходимых для жизни объекта и правильного выполнения.Somewhat related talk about dependency injection

class Foo { 
    private $instance; 
    public function __construct(\Type $instance) { 
     $this->instance = $instance; 
    } 
} 

Состав является проектирование ориентации, которая составляет с экземплярами, необходимыми для работы вместо того, чтобы наследовать от них, если это вообще возможно. Таким образом, он полагается как на инъекции зависимостей, так и на тип намека. More reading on composition

+0

Это тоже очень хорошее объяснение, спасибо. – user3102290

+0

Из того, что я могу собрать, это тоже не полно. В параметрах намека типа Symfony в контроллере также неявно создается инъекция услуг, поскольку контроллер использует этот тип «подсказка» для доступа к службе из контейнера. – RichieHH

+0

@ RichieHH hmmm .. этот вопрос примерно oop, не symfony. Упрямые взгляды на symfony никоим образом не являются ссылкой. «Знание symfony» и «знание oop» - это не одно и то же. –