Концептуальное понимание: Когда я впервые посмотрел на глубокое понимание Yii 2.0, я также был сбит с толку. Атрибуты не являются атрибутами классов. Что я могу сказать? Позже стало известно, что структура Yii различает переменные-члены и атрибуты. Какова связь между переменными-членами и атрибутами? Давайте сначала рассмотрим более письменное утверждение: “Переменные-члены-это понятия с точки зрения структуры класса, в то время как атрибуты-это понятия с точки зрения функциональной логики класса, которые тесно связаны и отличаются друг от друга”. Точка зрения заключается в том, что атрибуты являются абстрактными понятиями из бизнеса, и реализация атрибутов в коде зависит от переменных-членов, но нельзя сказать, что атрибуты являются переменными-членами (это кажется не очень простым…), и атрибуты могут управлять разрешениями на чтение и запись в коде, в то время как переменные-члены не могут.
Этапы реализации атрибутов
- Наследование от
yii
\базовый\Базовый объект
。 - Объявите закрытую переменную-член для хранения свойства.
- предоставьте
геттер
илисеттер
Функции, или и то, и другое, для доступа и изменения частных переменных-членов, упомянутых выше. Если только указангеттер
, то свойство доступно только для чтения и только длясеттера
Только для записи.
Демонстрация реализации атрибутов
Be careful: In the demo above, $_val is the member variable title, which is an abstract business attribute. The recommended inheritance from Yii 2.0.13 is yii base BaseObject, not yii base Object, because after php7.2 Object is a reserved word and can no longer be used as a class name.
это Yii
Как пройти через getTitle()
и setTitle()
Функции управления свойствами заголовок
Как насчет чтения и записи? На самом деле, это очень просто. __get()
и __set()
Два волшебных способа сделать это.
Принцип реализации атрибута
Ниже приведен класс. Базовый объект
Внутри для __set()
и __get()
Реализация магического метода.
public function __get($name) { $getter = 'get' . $name; if (method_exists($this, $getter)) { return $this->$getter(); } elseif (method_exists($this, 'set' . $name)) { throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name); } throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name); } public function __set($name, $value) { $setter = 'set' . $name; if (method_exists($this, $setter)) { $this->$setter($value); } elseif (method_exists($this, 'get' . $name)) { throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name); } else { throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name); } }
Когда мы читаем классы Статья
Внутри примера заголовок
Когда значение задано, класс проходит. Статья
Атрибуты в нем автоматически активируются, когда соответствующие атрибуты не могут быть найдены. __get()
Волшебный метод [Примечание: автоматически срабатывает при вызове неопределенных или невидимых атрибутов класса в текущей среде], __get()
Вызовите его снова в методе getTitle()
Метод. установите свойство название
Тот же принцип. [Примечание: Поскольку PHP не учитывает регистр для методов класса, то есть $obj – > getTitle () и $obj – > getTitle () вызывают одну и ту же функцию]
Резюме
Приведенное выше резюме относится к глубокому пониманию Yii 2.0 [это может относиться к большему, эй], на самом деле, я видел это раньше, но это ограничивается только просмотром, без запуска демо-отладки, просмотром исходного кода, а затем я ошибочно думаю, что понимаю, на самом деле, через два дня я ничего не помню. Так что теперь, ведя блоги, чтобы углубить свое понимание, из-за ограниченного уровня, приветствуйте небольших партнеров для обмена и исправления.