Во-первых, я настоятельно рекомендую не returning
если префикс или имущественными переменные не установлены. Это сделает отладку ОЧЕНЬ трудной. Вместо этого замените return;
на throw new BadMethodCallException('Method Does Not Exist: '.$method);
Во-вторых, разве это не побеждает точку защищенных переменных? Он позволяет читать и записывать все свойства без какой-либо проверки. Если вы собираетесь это сделать, вы также можете сделать их общедоступными.
Я лично считаю $foo->bar = 'baz';
более читаемым, чем $foo->setBar('baz');
. Не потому, что это «легче» понять, а потому, что второй лишний раз лишний раз.
Лично я предлагаю сделать __get
и __set
и добавить проверку. Весь смысл защиты переменных - это доверие (чтобы вы могли доверять настройкам). Конечно, вы можете использовать отражение или подклассификацию, чтобы изменить их, но я обычно предполагаю, что если кто-то зайдет так далеко, они заслуживают каких-либо непреднамеренных заговоров, если они испортили переменную.
И имейте в виду, что если вы используете какой-либо вид магического метода, вам необходимо добавить элементы документации, если вы хотите, чтобы ваш IDE намекнуть методы/переменные для вас ...
EDIT:
И не забывайте, что если вы объявите методы /__set
, вы можете переопределить их в дочерних классах. Поэтому, если ребенок объявляет новые переменные, вы можете обрабатывать их там, а затем вызвать parent::__get
для обработки переменных по умолчанию. Поэтому не используйте массив только для того, чтобы у вас был один метод для всех детей. Сделайте валидацию для членов, о которых вы знаете, и позвольте своим детям справляться с собственной проверкой ...
Из интереса, почему вы используете __call, а не __get и __set? –
Мне просто показалось, что я тоже скопировал его: http://onlamp.com/pub/a/php/2005/06/16/overloading.html –