Как мне использовать PHP __get() и __set() для определенных полей в моем классе?
-
19-09-2019 - |
Вопрос
Я хорошо прочитал о Спецификации PHP по перегрузке, и большинство примеров, по-видимому, предназначены для того, чтобы просто разрешить определение пользовательских полей (аналогично stdClass).
Но как насчет приватных полей, определенных в моем классе?Как они должны быть извлечены / назначены?Я мог бы переключить возможные значения и действовать в соответствии с определенными значениями:
class A
{
private $name;
private $age;
public function __get( $var )
{
switch ( $var )
{
case 'name':
return $this->name;
break;
case 'age':
return $this->age+10; // just to do something different ;)
break;
default:
break;
}
}
}
Является ли это лучшим методом или существует другая общепринятая наилучшая практика?(Я не знаю, возможно ли зацикливать переменные класса внутри класса, но в любом случае это не подходит в большинстве ситуаций, поскольку вы не хотите возвращать все.)
Решение
Это фактически сделало бы их общедоступными, и обычно это ничего не дает вам по сравнению с простым использованием общедоступных свойств (но вы платите за снижение производительности и должны писать больше кода, рискуя ошибками).
Используйте это, только если у вас есть существующий код, который использует общедоступное свойство, и вам внезапно понадобится getter / setter для него (как в вашем примере с age
).
Если вам нужно выполнить какой-то код при чтении / записи свойства (напримерсделайте его доступным только для чтения или лениво извлекайте из базы данных), тогда вам следует использовать обычные методы получения / установки (getAge()
/setAge()
).
Другие советы
Я широко использую __get()
и __set()
И у меня есть объявленные мои свойства public
.Я хотел получить лучшее из обоих миров, чтобы моя среда разработки могла отображать общедоступные свойства для меня, когда я ввожу имя экземпляра класса.Как мне удалось заставить методы PHP-перехватчика работать, даже если свойства являются общедоступными и видны за пределами класса?
отменить установку() свойств Я хочу __get()
и __set()
для использования в классе __construct()
.
Выяснение этого метода заняло пару вечеров разочарования :-)
Я не вижу, чтобы многие люди ими пользовались, но вот что я думаю.
Для извлечения частных переменных вы, вероятно, захотите предоставить список определенных переменных, к которым может быть получен доступ извне.Затем проверьте, находится ли запрошенная переменная в этом массиве.Если это так, разрешите это изменить / получить.Если нет, то либо ошибка, либо возвращает null.
Честно говоря, реализации для этого действительно подбираются в каждом конкретном случае.Если бы у вас был класс user, в котором вы хранили всю информацию в одном массиве, вы могли бы извлечь $user-> name из $user->account['name'] или что-то в этом роде.
Кроме того, в более индивидуальном порядке вы могли бы внести некоторые изменения, прежде чем присваивать им значения, например, хэшировать пароль.