Свойства в Yii 2
Свойства в Yii 2

Свойства

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Переменные-члены класса PHP

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

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

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

Базовый класс [[yii\base\BaseObject]]

Что бы решить эту проблему, в Yii был добавлен базовый класс [[yii\base\BaseObject]] который реализует работу со свойствами через геттеры и сеттеры. Если вашему классу нужна такая возможность, необходимо унаследовать его от [[yii\base\BaseObject]] или его потомка.

Info: Почти все внутренние классы Yii наследуются от [[yii\base\BaseObject]] или его потомков. Это значит, что всякий раз, когда вы встречаете геттер или сеттер в классах фреймворка, вы можете обращаться к нему как к свойству.

Геттер в Yii 2

Геттер — это метод, чьё название начинается со слова get. Имя сеттера начинается со слова set. Часть названия после get или set определяет имя свойства. Например, геттер getLabel() и/или сеттер setLabel() определяют свойство label, как показано в коде ниже:

namespace app\components;

use yii\base\BaseObject;

class Foo extends BaseObject
{
    private $_label;

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

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

В коде выше геттер и сеттер реализуют свойство label, значение которого хранится в private свойстве _label.

Использование геттеров и сеттеров в Yii 2

Свойства, определенные с помощью геттеров и сеттеров, можно использовать как обычные свойства класса. Главное отличие в том, что когда происходит чтение такого свойства, вызывается соответствующий геттер, при присвоении значения такому свойству запускается соответствующий сеттер. Например:

// Идентично вызову $label = $object->getLabel();
$label = $object->label;

// Идентично вызову $object->setLabel('abc');
$object->label = 'abc';

Свойство, для которого объявлен только геттер без сеттера, может использоваться только для чтения. Попытка присвоить ему значение вызовет [[yii\base\InvalidCallException|InvalidCallException]]. Точно так же, свойство для которого объявлен только сеттер без геттера может использоваться только для записи. Попытка получить его значение так же вызовет исключение. Свойства, предназначенные только для чтения, встречаются не часто.

Правила и ограничения геттеров и сеттеров в Yii 2

При определении свойств класса при помощи геттеров и сеттеров нужно помнить о некоторых правилах и ограничениях:

  • Имена таких свойств регистронезависимы. Таким образом, $object->label и $object->Label — одно и то же. Это обусловлено тем, что имена методов в PHP регистронезависимы.
  • Если имя такого свойства уже используется переменной-членом класса, то последнее будет иметь более высокий приоритет. Например, если в классе Foo объявлено свойство label, то при вызове $object->label = 'abc' будет напрямую изменено значение свойства label. А метод setLabel() не будет вызван.
  • Свойства, объявленные таким образом, не поддерживают модификаторы видимости. Это значит, что объявление геттера или сеттера как public, protected или private никак не скажется на области видимости свойства.
  • Свойства могут быть объявлены только с помощью не статичных геттеров и/или сеттеров. Статичные методы не будут обрабатываться подобным образом.
  • Обычный вызов property_exists() не работает для магических свойств. Для них необходимо использовать [[yii\base\BaseObject::canGetProperty()|canGetProperty()]] или [[yii\base\BaseObject::canSetProperty()|canSetProperty()]].

Отказ от вызова функции trim() в Yii 2

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

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню