Здравствуйте!
Наверняка многие из вас знакомы с Zend Framework и знают об использовании метода цепочек в классах у него. Мне бы хотелось знать, можно ли каким-то волшебным образом реализовать класс на php таким образом, чтобы… Чтобы я наследовался от этого класса, писал свои методы и мой волшебный класс реализовывал цепочку, то есть вызывал мой метод, обрабатывал и сам возвращал $this. Это не лень писать лишнюю строку — пока это просто интерес. Важно, чтобы мне не приходилось давать методам класса каких-либо префиксов или чего-то похожего.
class cls extends Chainable {
protected $publicChainingMethods=array('superMethod');
public function superMethod_real($argument){echo 'in superMethod<br>';}
}
$c=new cls;
var_dump($c->superMethod(123));
Правила именования/способы проверки валидности варьируются по вкусу.
Жалко только, что до php 5.4 использование фокуса не всегда удобно из-за отсутствия мультинаследования.
Ну можно наоборот: добавлять при вызове префикс или суффикс к нормальному имени метода.
Разница в имени/при вызове — чтобы сработал __call. Другой способ — сделать метод закрытым, но это, имхо, еще хуже.
Третий способ — использовать класс — обертку не через наследование, а типа так:
Все просто, для работы __call на существующих функциях их достаточно сделать private или protected, и они будут доступны для вызова, но! Тогда появляется дырка в безопасности — вы можете вызывать любые методы. Как решить проблему?
Проблема номер два — если поместить определение __call в родительский класс, а методы вызывать в дочернем — до вызова метода из дочернего не доходит — идет бесконечный вызов __call родителя
Первая проблема решается упомянутом в предыдущем ответе перегружаемом списке «хороших» методов.
Но, что-то мне подсказывает, что делать «публичные» методы private или protected — по меньшей мере некрасиво.