Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите понять
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Помогите понять

Страниц (1): [1]
 

1. КимЧенИн - 22 Октября, 2018 - 13:30:52 - перейти к сообщению
Всем привет, никак до конца не пойму работу с интерфейсами.
Вот есть класс(привожу частично)
PHP:
скопировать код в буфер обмена
  1.  
  2. class CartEntityAddEvent
  3. ----
  4.  public function __construct(OrderInterface $cart, PurchasableEntityInterface $entity, $quantity, OrderItemInterface $order_item) {
  5.     $this->cart = $cart;
  6.     $this->entity = $entity;
  7.     $this->quantity = $quantity;
  8.     $this->orderItem = $order_item;
  9.   }
  10. -------
  11.   public function getEntity() {
  12.     return $this->entity;
  13.   }
  14.  

как видно в конструтор он принимает 3 интерфейса и одну переменную.
Нифига не пойму каким образом интерфейс преобразуется в класс

Вот он вызывается
PHP:
скопировать код в буфер обмена
  1.  
  2. class.....
  3. ---------
  4.   public function onAddToCart(CartEntityAddEvent $event) {
  5.     $this->purchasedEntity = $event->getEntity();
  6.   }
  7.  


Опять же как он вызывается? Это внедрение зависимости? Прямо в отдельную функцию? Как все это работает?
2. Мелкий - 22 Октября, 2018 - 14:35:10 - перейти к сообщению
КимЧенИн пишет:
Нифига не пойму каким образом интерфейс преобразуется в класс

Никак не преобразуется.
Вы в принципе не можете передать именно интерфейс параметром. Передать вы можете объект. Вы можете потребовать, чтобы параметр имел реализацию какого-то интерфейса. Если передаваемый параметром объект реализует нужный интерфейс - у вас уже есть подходящий объект. Если не реализует - у вас будет ошибка.
3. КимЧенИн - 22 Октября, 2018 - 14:40:35 - перейти к сообщению
Это рабочий модуль, он работает, я пытаюсь в нем разобраться.
В $this->entity = $entity точно объект передается.
если в php storm ctrl click по PurchasableEntityInterface то переходит именно в интерфейс
PHP:
скопировать код в буфер обмена
  1. /**
  2.  * Defines the interface for purchasable entities.
  3.  *
  4.  * Lives in Drupal\commerce instead of Drupal\commerce_order so that entity
  5.  * type providing modules such as commerce_product don't need to depend
  6.  * on commerce_order.
  7.  */
  8. interface PurchasableEntityInterface extends ContentEntityInterface {

нифига не понимаю
4. Мелкий - 22 Октября, 2018 - 15:56:07 - перейти к сообщению
КимЧенИн пишет:
В $this->entity = $entity точно объект передается.

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

Посмотрите в объявление любого класса, который можно передать в метод. У него (или его предков) будет указано implements PurchasableEntityInterface.
5. КимЧенИн - 22 Октября, 2018 - 16:46:18 - перейти к сообщению
Мелкий пишет:
Посмотрите в объявление любого класса, который можно передать в метод

Вот этот момент я и не понимаю, Каким образом сюда передается объект, если внедряется интерфейс.
Как увидеть этот класс. А если классов имплементирующих интерфейс несколько, то какой объект передается?
Я не понимаю именно прицип сего действа.
6. Мелкий - 22 Октября, 2018 - 16:53:30 - перейти к сообщению
КимЧенИн пишет:
А если классов имплементирующих интерфейс несколько, то какой объект передается?

Так и смотрите на код, где создаётся экземпляр CartEntityAddEvent.
type hinting всё равно, сколько у вас классов. Главное чтобы передавался параметром класс с нужным интерфейсом. Это обязанность того кода, который вызывает метод. Т.е. там где вызывается new CartEntityAddEvent
7. КимЧенИн - 22 Октября, 2018 - 17:01:10 - перейти к сообщению
В том то и дело, вот как он вызывается
PHP:
скопировать код в буфер обмена
  1.  
  2.   public function onAddToCart(CartEntityAddEvent $event) {
  3.     $this->purchasedEntity = $event->getEntity();
  4.  
  5.   }
  6.  

Все!
Просто запрвшивается метод из класса который возвращает переменную,
PHP:
скопировать код в буфер обмена
  1.   /**
  2.    * Gets the added entity.
  3.    *
  4.    * @return \Drupal\commerce\PurchasableEntityInterface
  5.    *   The added entity.
  6.    */
  7.   public function getEntity() {
  8.     return $this->entity;
  9.   }

которая содержит объект, который хрен знает как туда попадает Огорчение
(Добавление)
Вот я пытаюсь проделать то же самое в своем классе, нифига не получается
PHP:
скопировать код в буфер обмена
  1.  
  2.     public function __construct(CartEntityAddEvent $event) {
  3.       $this->purchasedEntity = $event->getEntity();
  4.     }

Цитата:
ArgumentCountError: Too few arguments to function
8. Мелкий - 22 Октября, 2018 - 17:40:24 - перейти к сообщению
Нет, это не всё.
Обратите внимание, в метод onAddToCart передаётся уже имеющийся и созданный ранее объект класса CartEntityAddEvent. И там где этот объект был создан - там и передаются параметры в __construct. Возможно скрыто некоторой магией вроде reflection

 

Powered by ExBB FM 1.0 RC1