Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Геттеры и сеттеры при помощи трейта либо мощные стороны PHP

Anna | 31.05.2014 | нет комментариев

Маленькая идея о реализации геттеров и сеттеров в PHP версии > 5.4 и размышления о подходе к свойствам класса в контексте PHP.

Теория

Есть несколько методов обращения к свойствам класса:

1. Сделать их public.
2. Определить способы доступа типа getA, setA.
3. Применять волшебные способы __get, __set.

Здесь стоит остановиться на специфике PHP, как языка в целом. Динамическая типизация, легкий синтаксис и уйма готовых решений открывают безбрежные просторы для стремительного прототипирования. PHP подлинно разрешает написать много работающего кода без продумывания каждой архитектуры в самом начале. И это подлинно значимо, в современном мире яростной соперничества и, фактически, беззащитности большинства идей. Следственно, не стоит рассматривать финальный код PHP и сопоставлять его с другими языками — необходимо рассматривать каждый процесс разработки.

Выходит, легкомысленное, противоречащее канонам ООП и классного жанра, предназначение аттрибута publicнетипизированным свойствам на самом деле имеет большое значение в изначальной разработке архитектуры. На этом этапе мы можем с легкостью менять типы свойств объекта, либо их имена, нам не необходимо волноваться о их охране либо корректности.
Также разумно, что обратиться к свойству класса $a->b = 1 стремительней и короче и на этом этапе не имеет смысла создавать способы доступа (чай пока нас не беспокоят вопросы инкапсуляции — мы занимаемся творчеством).

И вот, у нас возник работающий прототип — настало время подумать о последующей поддержке кода, о охране информации и других программистах. Позже первого этапа у нас остались классы, определились наименования их свойств. И во каждому плане мы обращаемся к свойствам напрямую $a->b. Здесь появляется задача — как нам ограничить доступ к свойствам, не меняя обращения к ним всюду. К сожалению, в PHP пока отсутствуют нативные решения этой задачи. Но все же мы можем это реализовать чуть менее прекрасно.

Вопрос решается магическими способами __get и __set и созданием способов доступа. А для комфорта разработки мы добавляем doc-комментарии к классу. В целом, фактически всякий объект комфортно применять по такой схеме и разумно было бы перенести идентичные части в обособленный код. До PHP 5.4 это было допустимо реализовать только при помощи наследования, но фактически — было немыслимо из-за отсутствия множественного наследования. Да и в целом — наследовать иной класс с целью лишь вынесения всеобщего кода нарушает логику связей объектов.

И вот, в PHP 5.4 нам подарили не геттеры и сеттеры, а трейты. Добросовестно говоря, я не вижу много причин их применения — в основном желание воспользоваться ими говорит о дрянной объектной системе плана. Но вот некоторую не хватающую функциональность PHP они закрывают. Лично меня огромнее бы устроили геттеры и сеттеры.

Практика

Нижеприведенный код является небольшим примером реализации геттеров и сеттеров. При желании дозволено добавлять разные вероятности. Основное, что с трейтами это необходимо будет делать лишь в одном месте.

	trait GetterSetter
	{
		public function __get($name)
		{
			$getter = 'get' . ucfirst($name);
			if ( ! method_exists($this, $getter) )
			{
				throw new Exception('Not found getter for property - ' . $name);
			}
			return $this->$getter();
		}
		public function __set($name, $value)
		{
			$setter = 'set' . ucfirst($name);
			if ( ! method_exists($this, $setter) )
			{
				throw new Exception('Not found setter for property - ' . $name);
			}
			$this->$setter($value);
			return $this;
		}
	}

В классе A, качество b контролируется нами с поддержкой трейта, а c пока «в свободном плаванье».

	/**
	 * 
	 * @property int $b
	 *
	 */
	class A
	{
        use GetterSetter;

        /**
         * @var unknown Временно всякий тип значения
        */
        public $c;
        private $_b;
		public function getB()
        {
            return $this->_b   1;
        }
		public function setB($value)
        {
            if ( ! ($value === 2 || $value === 3 ) )
            {
                throw new Exception('Invalid value ' . $value . ' for b' );
            }
            $this->_b = $value - 1;
            return $this;
        }        
	}

Пример обращения к свойству.

    $a = new A;
    $a->b = 7;

Что еще дозволено сделать на основе такого трейта:

1. Свойства read-only, write-only и т.д.
2. Реализовать присвоение значение свойству в трейте, а в самом классе способы проверки типа checkB().

P.S. Ожидаем ваши варианты в опрос и примеры применения трейтов.

А что вам огромнее каждого не хватает в PHP?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 29 человек. Воздержалось 17 человек.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB