__call
фактически работает для всех методов, включая публичные. Однако причина, по которой он не будет работать, если открытый метод уже существует, заключается в том, что код вне вашего класса уже может получить доступ к открытым членам. __call
вызывается только для участников, которые не доступны по вызывающему коду.
Насколько я знаю, на самом деле нет вариантов сделать то, что вы ищете, кроме как с помощью какого-то шаблона декоратора:
class AuthDecorator {
private $object;
public function __construct($object) {
$this->object = $object;
}
public function __call($method, $params) {
//Put code for access checking here
if($accessOk) {
return call_user_func_array(array($this->object, $method), $params);
}
}
}
$api = new MY_Api();
$decoratedApi = new AuthDecorator($api);
//any calls to decoratedApi would get an auth check, and if ok,
//go to the normal api class' function