За последние 24 часа нас посетили 22625 программистов и 1016 роботов. Сейчас ищут 660 программистов ...

Зачем нужно обращение к свойству как к методу, реализованное с помощью __get()

Тема в разделе "Yii", создана пользователем SpikePHP, 21 май 2019.

  1. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Приветствую!
    В движке Yii если создать модель yii\base\Model то к её свойствам можно обратиться:

    Код (Text):
    1. $model1->getAttributes()
    что вернёт :
    Код (Text):
    1. Array
    2. (
    3. [id] => 0,
    4. [username]=>'Ivan',
    5. [email]=>'ivan@mail.com'
    6. )

    То же самое можно получить с помощью :
    Код (Text):
    1. $model1->attributes
    что сделано в фреймворке Yii с помощью __get():
    Код (Text):
    1.     public function __get($name)
    2.     {
    3.         $getter = 'get' . $name;
    4.         if (method_exists($this, $getter)) {
    5.             return $this->$getter();
    6.         } elseif (method_exists($this, 'set' . $name)) {
    7.             throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    8.         }
    9.  
    10.         throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
    11.     }
    Вопрос : Для чего это нужно? Зачем такая возможность?
     
  2. roswww

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

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    __get(): - это магический метод в рнр https://www.php.net/manual/ru/language.oop5.magic.php в своём приложении лично я их не использую ,да и в известном расширении dektrium их не заметил, обхожусь без них

    Код (Text):
    1.   public function getTimeZone()
    2.     {
    3.         try {
    4.             return new \DateTimeZone($this->timezone);
    5.         } catch (\Exception $e) {
    6.             // Default to application time zone if the user hasn't set their time zone
    7.             return new \DateTimeZone(\Yii::$app->timeZone);
    8.         }
    9.     }
    10.  
    11.     /**
    12.      * Set the user's time zone.
    13.      * @param \DateTimeZone $timezone the timezone to save to the user's profile
    14.      */
    15.     public function setTimeZone(\DateTimeZone $timeZone)
    16.     {
    17.         $this->setAttribute('timezone', $timeZone->getName());
    18.     }
    19.  
    20.     /**
    21.      * Converts DateTime to user's local time
    22.      * @param \DateTime the datetime to convert
    23.      * @return \DateTime
    24.      */
    25.     public function toLocalTime(\DateTime $dateTime = null)
    26.     {
    27.         if ($dateTime === null) {
    28.             $dateTime = new \DateTime();
    29.         }
    30.  
    31.         return $dateTime->setTimezone($this->getTimeZone());
    32.     }

    Когда у меня выдало такую ошубку насчёт __get(); я просто добавил в ненспэйсы
    путь.
    и прописал в модель.
    что то типо этого

    public function getProfile()

    {
    return $this->hasOne(Profile::className($id = null), ['user_id' => 'id']);//!-нужна для вывода профиля картинок
    }
     
    #2 roswww, 21 май 2019
    Последнее редактирование: 21 май 2019
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Так Макарову (на данный момент главному разрабу фреймворка) захотелось :) Мне нравится, например, использовать магические свойства. Некоторые предпочитают прямые вызовы геттеров. Видимо, чтоб был у программистов выбор :) А Laravel тебя вообще в другой класс иногда магией закидывает, так что этот момент в Yii2 достаточно прозрачный
     
    SpikePHP нравится это.
  4. roswww

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

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    samdark ,а да я читал что он пишет?
    https://yiiframework.ru/forum/viewtopic.php?t=37673
    Честно не вижу смысла так заморачиваться у меня и так всё работает , есть задачи по актуальней.