В каждом объекте, который работает с БД, плодятся методы, которые я называю рутинными. Примеров тьма: getLoginById, getIdByLogin, getAliasByName. getNameById и так далее. Поскольку практически суть везде одна и таже (выполнить select с некой таблицы БД по некому признаку и вернуть value) я утвердил в своем движке стандарт вызова метода __call
Для начала договоримся, что в каждом классе, который унаследован от Core, должно присутствовать свойство $call, которое содержит ассоциативный масив следующего виду
- table - название таблицы по умолчанию, с которой брать данные. Значение задается в конструкторе класса.
- fields_private - масив с перечнем названия полей, доступ к которым через метод __call нужно закрыть
public function __call($methodName, $args)
$methodName - название несуществующего метода, которого мы вызываем
$args - массив параметров:
первый параметр - значение поля, по которому ищем запись в БД
второй параметр - название таблицы, если нету - используется $call['table']
Пример
В классе User вызываем не существующий метод getEnableById - в даном случаи мне нужно получить значени поля enable из таблицы users по значению поля id. В классе задано свойсто protected $call = array('table' => 'users', 'fields_private' => array());
На самом деле я создал метод getEnableById только ради автодополнения в IDE. Также методы следует задавать явно, если необходимо выполнить дополнительные действия. В этом примере выполняется проверка на существование $id (если отсутствует, тогда присвоить $_SESSION['user']['id'])
public function getEnableById($id = '') { if ($id == '') { $id = $_SESSION['user']['id']; } return parent::__call(__METHOD__, $id); }