Как мне использовать PHP __get() и __set() для определенных полей в моем классе?

StackOverflow https://stackoverflow.com/questions/1180935

Вопрос

Я хорошо прочитал о Спецификации 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'] или что-то в этом роде.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top