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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите понять

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
КимЧенИн
Отправлено: 22 Октября, 2018 - 13:30:52
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2018  


Помог: 0 раз(а)




Всем привет, никак до конца не пойму работу с интерфейсами.
Вот есть класс(привожу частично)
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.  


Опять же как он вызывается? Это внедрение зависимости? Прямо в отдельную функцию? Как все это работает?

(Отредактировано автором: 22 Октября, 2018 - 13:36:28)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2018 - 14:35:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




КимЧенИн пишет:
Нифига не пойму каким образом интерфейс преобразуется в класс

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


-----
PostgreSQL DBA
 
 Top
КимЧенИн
Отправлено: 22 Октября, 2018 - 14:40:35
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2018  


Помог: 0 раз(а)




Это рабочий модуль, он работает, я пытаюсь в нем разобраться.
В $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 {

нифига не понимаю
 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2018 - 15:56:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




КимЧенИн пишет:
В $this->entity = $entity точно объект передается.

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

Посмотрите в объявление любого класса, который можно передать в метод. У него (или его предков) будет указано implements PurchasableEntityInterface.


-----
PostgreSQL DBA
 
 Top
КимЧенИн
Отправлено: 22 Октября, 2018 - 16:46:18
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2018  


Помог: 0 раз(а)




Мелкий пишет:
Посмотрите в объявление любого класса, который можно передать в метод

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



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




КимЧенИн пишет:
А если классов имплементирующих интерфейс несколько, то какой объект передается?

Так и смотрите на код, где создаётся экземпляр CartEntityAddEvent.
type hinting всё равно, сколько у вас классов. Главное чтобы передавался параметром класс с нужным интерфейсом. Это обязанность того кода, который вызывает метод. Т.е. там где вызывается new CartEntityAddEvent


-----
PostgreSQL DBA
 
 Top
КимЧенИн
Отправлено: 22 Октября, 2018 - 17:01:10
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Окт. 2018  


Помог: 0 раз(а)




В том то и дело, вот как он вызывается
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

(Отредактировано автором: 22 Октября, 2018 - 17:06:49)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Октября, 2018 - 17:40:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Нет, это не всё.
Обратите внимание, в метод onAddToCart передаётся уже имеющийся и созданный ранее объект класса CartEntityAddEvent. И там где этот объект был создан - там и передаются параметры в __construct. Возможно скрыто некоторой магией вроде reflection


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB