Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > перехват вызова функции


Автор: gagar 3.8.2007, 12:28
Доброго времени суток, уважаемые эксперты! 

Вопрос: в PHP5 существует magic method __call(). Как я понял из доступной мне документации этот метод выполняется при вызове несуществующего метода класса. Существуют ли в PHP механизмы, позволяющие перехватывать вызов существующего метода класса?

Автор: Mal Hack 3.8.2007, 12:48
А смысл? Вы обращаетесь $obj->method(), который у вас уже определен Вами, зачем его перегружать?

Автор: gagar 3.8.2007, 13:14
Смысл есть. Используя перехват вызова функций можно управлять правами доступа на сайт на уровне функций динамически, не меняя код всего сайта. Идея "классическая": свести всю защиту в единый базовый "центр", чтоб не задумываться о ней в процессе написания сложных скриптов. Математика под это дело мной уже разработана, осталось реализовать перехват функций smile Есть какие идеи? Я пока даже не представляю... :(

Автор: murod 3.8.2007, 14:21
Перехват функции это не самая хорошая идея. лучше было бы проверять перед вызовом метода объекта на доступ. Хотя перехват вызова метода можно реализовать с помощью Рефлексией. Надо создать класс делегатор и через него вызывать методы объектов. 
вот пример из книги "PHP Power Programming":
Код

class ClassOne {
function callClassOne() {
print "In Class One\n";
}
}
class ClassTwo {
function callClassTwo() {
print "In Class Two\n";
}
}
class ClassOneDelegator {
private $targets;
function __construct() {
$this->target[] = new ClassOne();
}
function addObject($obj) {
$this->target[] = $obj;
}
function __call($name, $args) {
foreach ($this->target as $obj) {
$r = new ReflectionClass($obj);
if ($method = $r->getMethod($name)) {
// вот здесь можно проверить на доступ.
if ($method->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = new ClassOneDelegator();
$obj->addObject(new ClassTwo());
$obj->callClassOne();
$obj->callClassTwo();


Цитата

In Class One
In Class Two

Автор: Mal Hack 3.8.2007, 15:10
А что мешает делать эту проверку в __call() а затем внутри этого метода, в зависимости от результатов проверки вызывать нужные пользовательские методы, к примеру cMyMethod(), а обращаться myMethod().

Для  PHP, имхо, это наиболее рациональное решение. Или увязываться на P/P/P...

Автор: gagar 3.8.2007, 15:12
__call() срабатывает только при вызове несуществующего метода. В "Рефлексии" реализован вызов несуществующего метода с последующим перенаправлением в нужный класс.

Да! Вот это как раз то, что надо! Правда, несколько извращенно, но мысль понятна. Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)