За последние 24 часа нас посетили 22258 программистов и 1056 роботов. Сейчас ищут 680 программистов ...

Магия

Тема в разделе "PHP для профи", создана пользователем machetero, 12 окт 2017.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Класс Container

    PHP:
    1.     /**
    2.      * Dynamically access container services.
    3.      *
    4.      * @param  string  $key
    5.      * @return mixed
    6.      */
    7.     public function __get($key)
    8.     {
    9.         return $this[$key];
    10.     }
    11.  
    12.     /**
    13.      * Dynamically set container services.
    14.      *
    15.      * @param  string  $key
    16.      * @param  mixed   $value
    17.      * @return void
    18.      */
    19.     public function __set($key, $value)
    20.     {
    21.         $this[$key] = $value;
    22.     }
    Кто-нибудь может объяснить, что здесь происходит ? Там есть и реализация ArrayAccess.

    $this[$key] - это обращение к массиву или к объекту ?

    А так ?

    $container = new Container();
    $container['service']->launch();
    --- Добавлено ---
    Да, фреймворк ларавель ))
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Он вероятно наследует ArrayAccess
    --- Добавлено ---
    http://php.net/arrayAccess первый пример.
    --- Добавлено ---
    Обращение к объекту, но можно обращаться с объектом как с массивом.
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Он его реализует, иначе он не смог бы, делать так в коде - $this[$key]
    Дело в том, что непонимаешь, что это за переменная $container
    Код (Text):
    1. $container = new Container();
    2. $container['module']; // - объект или массив
    У объекта не может быть индексов, при этом в первой строчке мы вроде создали объект.
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Да, реализует.

    Я не понимаю, что именно тебя смушает.)) Ты же сам говоришь, что твой класс реализует ArrayAccess
     
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Ладно, он может так сделать у себя в __get
    PHP:
    1. function __get ($key)
    2. {
    3. $this['module'];
    4. }
    при этом в php $this не может быть ничем кроме объекта ... или ссылки на объект ... или, короче я уже нихера не понимаю ))
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. class A implements ArrayAccess {
    2.  
    3.     private $container = [];
    4.  
    5.     public function offsetExists($offset): bool {
    6.        
    7.     }
    8.  
    9.     public function offsetGet($offset) {
    10.         return $this->container[$offset];
    11.     }
    12.  
    13.     public function offsetSet($offset, $value) {
    14.         $this->container[$offset] = $value;
    15.     }
    16.  
    17.     public function offsetUnset($offset) {
    18.        
    19.     }
    20.  
    21.     function __get($name) {
    22.         $this[$name];
    23.     }
    24.  
    25.     function __set($name, $value) {
    26.         $this[$name] = $value;
    27.     }
    28.  
    29. }
    30.  
    31. $a = new A();
    32. $a->test = 'test';
    33. echo $a['test'];
    Теперь понятно?))
    --- Добавлено ---
    я кое какие проверки опустил, пример чисто для демонстрации
    --- Добавлено ---
    это чтобы ты понял на что там магия.
    --- Добавлено ---
    Ты видимо не доконца понял что дает ArrayAccess, почитай.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.551
    Симпатии:
    1.754
    Если класс реализует ArrayAccess, с его объектами можно обращаться как с массивами, т.е. индексировать. Иногда бывает удобно