Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/101401b1285b3d1aead1ae46a209230f to your computer and use it in GitHub Desktop.
Save anonymous/101401b1285b3d1aead1ae46a209230f to your computer and use it in GitHub Desktop.
Свойствам может использоваться в качестве

Свойствам может использоваться в качестве



Быстрые ответы по профессионалу платформы
Бесплатная помощь с домашними заданиями
Знакомство с технологией Automation-сервер на примерах

Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Как правило, мнения расходятся касательно того, хорошей ли практикой является использование публичных свойств в PHP классах или всё же стоит использовать геттеры и сеттеры и хранить свойства приватными или защищёнными. У каждого из подходов существуют свои достоинства и недостатки, давайте взглянем на них… Пример использования публичных свойств: При таком подходе мы можем манипулировать данным свойством как угодно и хранить в нём любые данные. Достоинства публичных свойств По сравнению с геттерами и сеттерами, нужно печатать на много меньше текста! Код выглядит более читабельным и работать с ним проще, чем с вызовами геттеров и сеттеров. Вызов публичного свойства вместо set или get работает быстрее и использует меньше памяти чем вызов метода, но выгода от этого будет почти незаметной до тех пор, пока вы не будете вызывать метод множество раз в длинном цикле. Недостатки публичных свойств Нет возможности осуществлять контроль за тем, какие именно данные содержатся в свойствах — их очень легко заполнить данными, некорректными для методов этого класса. Например, если класс будет использоваться сторонним разработчиком, отличным от автора класса, то могут возникать проблемы связанные с тем, что он может быть не в курсе да он и не обязан внутреннего устройства класса. В конце концов, ни для кого не секрет, что зачастую по прошествии несколько месяцев даже сам автор забывает логику написанного им кода. Если вы хотите использовать публичные свойства в API, то этого нельзя будет сделать используя интерфейс, так как в PHP интерфейсы допускают только определения сигнатур методов. Пример использования геттеров и сеттеров: Для того, чтобы получить значение свойства, вам придётся использовать метод getBar , или setBar для присвоения свойству значения. Чтобы вы могли быть уверенны в том, что входные данные полностью корректны, данные методы могут включать в себя соответствующий функционал для их валидации. Достоинства геттеров и сеттеров Используя геттеры и сеттеры вы можете осуществлять контроль за тем, какие именно данные содержатся в свойствах объекта, и отклонять любые некорректные значения. Так же вы можете осуществлять дополнительные операции перед тем, как установить или получить значение свойства например, если обновление данного свойства должно вызывать некоторое действие, такое как оповещение пользователя. При установке значения, которое является объектом или массивом, вы можете явно указать тип переменной в сигнатуре функции прим. К большому сожалению, PHP не позволяет проделывать тоже самое с типами int и string! Если значение свойства должно получаться из внешнего источника или среды исполнения, вы можете использовать ленивую загрузку данных — таким образом ресурсы, требуемые для загрузки данных, будут задействованы непосредственно во время получения значения свойства. Разумеется, в данном случае нужно соблюдать осторожность, и не следует получать данные из внешнего источника при каждом обращении к свойству. Будет лучше сделать одно обращение к базе данных и заполнить значения всех свойств сразу, чем делать это для каждого в отдельности. Вы можете сделать свойство доступным только на чтение или только на запись, путём создания только геттера или только сеттера. Вы можете добавить геттеры и сеттеры в интерфейс для того, чтобы отобразить их в API. Недостатки геттеров и сеттеров Для разработчиков, которые используют прямой доступ к свойствам, геттеры и сеттеры кажутся настоящей головной болью! Имена геттеров и сеттеров принято начинать с глаголов get и set , но данные глаголы так же могут использоваться и в других методах, которые ни коим образом не относятся к свойствам класса. Пример использования магических геттеров и сеттеров: Данный подход может показаться золотой серединой, но у него есть существенный недостаток см. Достоинства магических геттеров и сеттеров Вы можете манипулировать свойствами напрямую как если бы они были публичными и сохраняете полный контроль над тем, какие данные хранятся в каких свойствах. Аналогично использованию обычных геттеров и сеттеров, вы можете осуществлять дополнительные операции, когда свойство используется. Вы можете использовать ленивую загрузку данных. Вы можете сделать свойства доступными только на чтение или только на запись. В большинстве случаев это невозможно если только вы не один из хардкорных программистов, которые думают что notepad является IDE! Как заметил один из комментаторов, этот недостаток может быть устранён использованием phpDoc тегов property , property-read , и property-write. Какой подход использовать Очевидно, что у геттеров и сеттеров есть ряд существенных преимуществ, и некоторые люди считают, что их стоит использовать всё время особенно те, у кого прошлое связано с Java! Но на мой взгляд, этим они нарушают естественное развитие языка, и их излишняя сложность и детализация принуждают меня работать с этим, даже если в этом нет надобности меня раздражает, когда обычные геттеры и сеттеры НЕ делают ничего, кроме получения и установки свойства. В таких случаях я стараюсь использовать публичные свойства, а геттеры и сеттеры я использую для критических свойств, которые необходимо более строго контролировать, или если в них необходимо использовать отложенную загрузку данных. До изучения PHP я использовал C. В C все свойства имеют методы доступа, но вам не нужно вызывать их как методы, вы можете манипулировать свойсвами напрямую и соответствующие методы будут вызываться магически. Это золотая середина и было бы очень хорошо увидеть аналогичную возможность в PHP. Печально, но, RFC необходимый для реализации C подобного синтаксиса определения методов доступа к свойствам не набрал необходимых две трети голосов: PHP , getters , setters , magic methods. Программирование 2,9k авторов , 6,5k публикаций. Информационная безопасность 2,4k авторов , 6,4k публикаций. Разработка под Linux автора , публикации. Open source 1k авторов , 2,3k публикаций. Системное программирование авторов , публикаций. C авторов , публикаций. Java 1,1k авторов , 2,2k публикаций. Машинное обучение авторов , публикаций. JavaScript 1,9k авторов , 4k публикаций. Добавить в закладки Иван Пантелеев Yekver карма. Магические сеттеры и геттеры не могут быть эквивалентны публичным свойствам. Вложенные массивы и Magic Methods Нельзя сделать вот так вот: НЛО прилетело и опубликовало эту надпись здесь. Валится на этапе интерпретации. Пожалуй, нужно было задать вот такой вопрос: Но имхо, зачастую они используются не по назначению. В том комментарии не стал писать так как разговор шёл именно про геттеры в пределах одного класса , но вообще, конечно, идеальная читаемость достигается в этом случае: Однозначного выбора все равно нет. Где-то нужно использовать именно сеттеры, где то достаточно и очень удобно — использовать магику. А в части случаев вообще достаточно публичного атрибута. Тут главное без фанатизма. PHP-кодеры, повсеместно использующие гетеры и сеттеры меня, честно говоря, тоже убивают. Имхо, стоит придерживаться одного стиля. Меня, например, убивает ситуация, когда в каких-то классах публичные свойства, а в каких-то геттеры. Иногда ещё умудряются сочетать и то, и другое в одном классе. Кстати, изначальное использование геттеров всегда сильно упрощает рефакторинг. Скажем, вы решили запретить повторное переназначение имени для пользователя. Если имя у вас было публичным свойством, то вам придётся добавлять геттер и менять логику во всех местах, где это свойство использовалось, в случае геттера — достаточно изменить логику геттера. А реализуйте ка геттерами это: Я вообще не буду это реализовывать так. Через некоторое время вы поймёте, почему. И получится что-то вроде этого: Вот только всё равно это не избавит от конфликтов именований. На самом деле я не буду так думать, это забота ребят из Yii Framework. Однако им удалось создать весьма популярный и один из самых быстрых PHP-фреймворков современности. Не думаю, что у вас есть что-то, что может сравнится с ним по популярности. Да, пускай ваш код более удобно читать новичкам. Но кто его будет читать, если он окажется никому не нужным? Ваши примеры явно страдают в производительности перед примером из Yii. C таким же успехом можно писать на Java и не париться. Каким образом всё написанное вами связано с программированием и кодом? Yii — хорошая штука. Но это не делает её идеальной. Тем более при разговоре о коде, который присутствует в первом коммите в гитхаб 5 с лишним лет назад после этого был лёгкий рефакторинг к упомянутому виду 4 с лишним года назад. В коде класса строк и 17 контрибьюторов. Зависит от того, как использовать. В сферическом вакууме оптимизировать нечего, в другом вакууме можно лениво подсчитывать свойства один раз. В случае с ActiveRecord как в приведённом коде , проще было бы один раз подсчитать схема не так часто меняется. Но это всё экономия на спичках с учётом, что всё это происходит в ORM. Предположим, у вас итеративный процесс. Если у вас есть желание и дальше считаться тупоголовыми php-шниками — не вопрос. Я предпочитаю использовать нестрогость PHP для получения некоторых преимуществ перед остальными платформами, вы, видимо, предпочитаете эту нестрогость использовать для говнокода. Хороший код нужен не только для новичков, но и чтобы более опытные коллеги вас дебилом не считали. Ну и чтобы экономить деньги работодателя. Лет 8 назад во времена засилия чёрного SEO мой php-софт, написанный за 2 месяца, делал на автомате по к уников в день и приносил неслабые деньги, то есть со своей задачей справлялся. Вот только трогать его я старался как можно меньше — всё висело на соплях. А трогать хотелось, так как развивать было что. Даже через год после разработки хотел запустить это на новом сервере — не удалось. Мораль сей басни такова — говнокод тоже бывает крутым и полезным. Чаще всего один раз и в неизменном виде. Класс Record в Doctrine 1 состоит примерно из строк. Doctrine 1 — хороший для своих задач и своего времени ORM. В настоящее время есть Doctrine 2. В таких случаях я стараюсь использовать публичные свойства, а геттеры и сеттеры я использую для критических свойств, которые необходимо более строго контролировать Считаю, что удобнее для восприятия использовать что-то одно в отдельно взятом классе. Единообразие и гибкость при отсутствии каких-либо значимых дополнительных временных затрат. При наличии современных IDE вообще удивляюсь, что кому-то это может быть неудобно. Это реально ускоряет разработку: Не надо раздумывать, какие свойства делать приватными, а какие — нет. Становится доступен рефакторинг доступа к свойствам. Не нужно забывать о возможных изменениях кода. Переменные следует именовать, чтобы не было неоднозначности. Программист, который единичный целочисленный id преобразовал в массив и оставил его с тем же именем — очень плохой программист. Мне тоже странно видеть размышления на тему, а если вдруг пользователь станет емейл сообщением, то что делать с его возрастом? Не хочу переходить, на личности, но зачем спорить? Но если ты работаешь не один над проектом, который постоянно развивается, нельзя быть в чем-то уверенным. Это с родни преждевременной оптимизации, когда ты пишешь код основываясь на фичах текущей версии языка забывая о том, что язык изменяется — меняя свое поведение. Тем самым у тебя получается нечитаемый говнокод, который оптимально работает только с одной версией PHP. Вариант с магией и огромным switch — плохая практика, во первых он разрастется со временем до такой степени, что понять его через 2 месяца не представится возможным, а заказчику нужно добавить фичу еще вчера…. Кроме смены типа может смениться логика: Кто вам сказал, что в ваш прекрасный int не насуют массивов? Вы это как-то отслеживаете? Почему вы вообще говорите о типе свойства, если разговор идёт о public в языке без строгой типизации? Сменить типа свойства просто — скажем, сменили строковую дату в ISO на DateTime. Ребята из Yii говнокодеры, я понял вашу мысль. А вы гораздо умнее их, даже при том что выносите логику поведения на уровень моделей, да-да. Вы не поняли мою мысль. Моя мысль в том, что у вас у самого нет сформировавшегося подхода. И поподробнее про логику и уровень моделей. Мне кажется, вы кое-что путаете в терминологии. А мне вот такой вариант нравится: Без обид, но посмотрите все статьи на эту тему, итог всегда один и тот же: А выбора всё равно лишаем…. Я считаю что вместо того чтобы вводить магические свойства необходимо рефакторить код. Насчет геттеров и прямого доступа, я уверен, что необходимо чтобы все кодеры писали в одном стиле. Или не используем геттеры совсем или не используем публичный доступ. Конечно же, мы выбираем геттеры. Любая современная IDE должна умет их автоматически генерировать. За достаточно продолжительный срок разработки на php я использовал все три приведённых способа. И пришёл к такому выводу: Поэтому лучше использовать геттеры и сеттеры. Да, кода становится чуть больше. Да, мы теряем какие-то наносекунды на вызов метода, но плюсы перевешивают минусы. Помимо указанных в публикации, я добавлю такие: Программист всегда знает что происходит: Метки лучше разделять запятой. Сейчас Вчера Неделя ES8 вышел и вот его основные новые возможности 12,8k ES8 вышел и вот его основные новые возможности 12,8k Интересные публикации Хабрахабр Geektimes. Вы используете интерфейсы в Go неправильно!. Как поставить Ubuntu на RPI и подключить к Azure IoT Hub. Флешка, кабель и кардридер: В Росстандарт подали проект национального стандарта NB-FI для Интернета вещей GT. Стек, который позволил Medium обеспечить чтение на 2. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Карта рб подробная с расстояниями
Lemon одежда официальный сайт каталог
Магнитные банки акупункционного действия инструкция
Кинотеатр в гипермаркете семья расписание
Ричард длинные руки epub
Двойной виндзорский узел инструкция
Количественный и качественный состав учителей
Набор со штампами djeco cоздай историю pыцари
Выдача результатов в иогв спб где находится
Цвет черная карта
Можно ли мастурбировать на 37 неделе беременности
Италия лихтенштейн составы
Привет как дела перевод на английский язык
Нагано жора где ты был
Кбк пени имущество
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment