Spec-Zone.ru › Yii 2.0

Свойства

В PHP переменные членов класса также называются свойствами. Эти переменные являются частью определения класса и используются для представления состояния экземпляра класса (т. е. для различения одного экземпляра класса от другого). На практике вы часто захотите обрабатывать чтение или запись свойств особым образом. Например, вы можете захотеть всегда обрезать строку, когда она присваивается свойству label. Вы можете использовать следующий код для достижения этой цели:

$object->label = trim($label);

Недостатком приведенного выше кода является то, что вам необходимо будет вызывать trim() в каждом месте вашего кода, где вы устанавливаете значение свойства label. Если в будущем свойству label потребуется новое требование, например, первая буква должна быть заглавной, вам снова придется изменять каждый фрагмент кода, который присваивает значение label. Повтор кода приводит к ошибкам и это практика, которой следует избегать по возможности.

Для решения этой проблемы Yii предоставляет базовый класс, называемый yii\base\Object, который поддерживает определение свойств на основе методов класса getter и setter. Если классу нужна эта функциональность, он должен наследоваться от yii\base\Object или от его дочернего класса.

Информация: Почти каждый основной класс в фреймворке Yii наследуется от yii\base\Object или его дочернего класса. Это означает, что всякий раз, когда вы видите getter или setter в основном классе, вы можете использовать их как свойство.

Метод getter — это метод, имя которого начинается со слова get; метод setter начинается со слова set. Имя после префикса get или set определяет имя свойства. Например, getter getLabel() и/или setter setLabel() определяют свойство с именем label, как показано в следующем коде:

namespace app\components;

use yii\base\Object;

class Foo extends Object
{
    private $_label;

    public function getLabel()
    {
        return $this->_label;
    }

    public function setLabel($value)
    {
        $this->_label = trim($value);
    }
}

Для ясности, методы getter и setter создают свойство label, которое в данном случае внутренне ссылается на приватное свойство с именем _label.

Свойства, определённые методами getter и setter, могут использоваться как переменные членов класса. Основное различие состоит в том, что при чтении такого свойства будет вызван соответствующий метод getter, а при присвоении значения – соответствующий метод setter. Например:

// equivalent to $label = $object->getLabel();
$label = $object->label;

// equivalent to $object->setLabel('abc');
$object->label = 'abc';

Свойство, определённое методом getter без setter, является только для чтения. Попытка присвоить значение такому свойству приведёт к исключению InvalidCallException. Аналогично, свойство, определённое методом setter без getter, является только для записи, и попытка прочитать такое свойство также приведёт к исключению. Свойства, доступные только для записи, встречаются нечасто.

Существуют некоторые специальные правила и ограничения для свойств, определённых с помощью методов getter и setter:

  • Имена таких свойств нечувствительны к регистру. Например, $object->label и $object->Label эквивалентны. Это связано с тем, что имена методов в PHP нечувствительны к регистру.
  • Если имя такого свойства совпадает с именем переменной члена класса, то последняя будет иметь приоритет. Например, если у вышеупомянутого класса Foo есть переменная члена label, то присвоение $object->label = 'abc' повлияет на переменную члена label; эта строка не вызовет метод setter setLabel().
  • Эти свойства не поддерживают видимость. Не имеет значения, является ли свойство public, protected или private для метода getter или setter, определяющего его.
  • Свойства могут быть определены только с помощью нестатических методов getter и/или setter. Статические методы не будут обрабатываться аналогичным образом.
  • Обычный вызов property_exists() не работает для определения магических свойств. Следует вызывать canGetProperty() или canSetProperty() соответственно.

Возвращаясь к проблеме, описанной в начале данного руководства, вместо вызова trim() при каждом присваивании значения label, trim() теперь необходимо вызывать только в методе setter setLabel(). И если новое требование потребует, чтобы метка была изначально заглавной, метод setLabel() может быть быстро изменён без внесения изменений в другой код. Это изменение будет универсально влиять на каждое присвоение значения label.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-concept-properties.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API