Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перехват вызова функции 
:(
    Опции темы
gagar
Дата 3.8.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Доброго времени суток, уважаемые эксперты! 

Вопрос: в PHP5 существует magic method __call(). Как я понял из доступной мне документации этот метод выполняется при вызове несуществующего метода класса. Существуют ли в PHP механизмы, позволяющие перехватывать вызов существующего метода класса?
PM MAIL   Вверх
Mal Hack
Дата 3.8.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



А смысл? Вы обращаетесь $obj->method(), который у вас уже определен Вами, зачем его перегружать?
PM ICQ   Вверх
gagar
Дата 3.8.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Смысл есть. Используя перехват вызова функций можно управлять правами доступа на сайт на уровне функций динамически, не меняя код всего сайта. Идея "классическая": свести всю защиту в единый базовый "центр", чтоб не задумываться о ней в процессе написания сложных скриптов. Математика под это дело мной уже разработана, осталось реализовать перехват функций smile Есть какие идеи? Я пока даже не представляю... :(
PM MAIL   Вверх
murod
Дата 3.8.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 17.9.2005
Где: Uzbekistan/Tashke nt

Репутация: 2
Всего: 4



Перехват функции это не самая хорошая идея. лучше было бы проверять перед вызовом метода объекта на доступ. Хотя перехват вызова метода можно реализовать с помощью Рефлексией. Надо создать класс делегатор и через него вызывать методы объектов. 
вот пример из книги "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

--------------------
Люди всего мира берегите природу!  
PM MAIL ICQ   Вверх
Mal Hack
Дата 3.8.2007, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



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

Для  PHP, имхо, это наиболее рациональное решение. Или увязываться на P/P/P...
PM ICQ   Вверх
gagar
Дата 3.8.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) gagar - 3.8.2007, 15:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.