Автовызов функции

Stierus

Новичок
Автовызов функции

У меня возникла необходимость вызывать статическую функцию постороннего класса при вызове любой функции любого класса, как это можно организовать ?

Наглядно:

в начале скрипта идёт описание класса с некоей статической функцией, в качестве параметров в эту функцию поступают имена класса и метода, к которому обращаются сейчас :

PHP:
class System{
   static function exec($params=array()){
      //some action
      echo 'System::exec();<br />';
   }
}
А ниже в скрипте, какие бы классы не объявлялись, для всех при вызове метода класса сначала вызывается System::exec()

PHP:
class test{
   public function test1(){
      //some action
      echo 'test->test1();<br />';
   }
}
class test2{
   public function test2(){
      //some action
      echo 'test->test2();<br />';
   }
}

$x=new test;
$y=new test2;
$x->test1();
$y->test2();
Что бы выводило

System::exec();
test->test1();
System::exec();
test->test2();


Если бы функций test1 и test2 не существовало, можно было бы с помощью __call переопределить и все последующие классы наследовать от единого родителя с объявлеными правилами, но если эти функции есть, как быть ?
 

Major

Новичок
Нужно реализовать паттерн обсервер или я не понял?

Самый тупой вариант, без паттернов ООП и прочих заморочек:
Пишешь магический метод __call() который будет перехватывать вызовы, а нужные методы будут вызываться уже внутри __call(), в котором перед вызовом нужного метода вызовется твой статический метод. Только зачем? Супер пупер инициализация в экшенах или что?

Почитай про паттерн Observer, может ты хотел что-тотипа такого реализовать?
 

Stierus

Новичок
Обсервер - немного не то, там субъекты, которые надо регистрировать, у меня же всё должно происходить немного иначе. Любой класс автоматически должен стать субъектом при его описании, без дополнительных манипуляций дальше (регистрация субъекта, вызов каждой функции, получается, - это событие, о котором надо оповещать одного единственного подписчика) ... над __call я тоже долго думал, но проблема в том, что функции определяются в наследуемых классах ... они именно определяются, тоесть мой родитель никак не должен влиять на структуру наследника. Наследник просто описывает функции, как любой другой класс, родитель же делает всё, что я описывал выше. Ну или реализация без родителя, какими-то другими средствами php, о которых я ничего не слышал. (есть же возможность прописать в настройках автоматическую подгрузку файла к каждой странице, есть _call, возможно, есть методы как-то заставить и функции работать с предварительным вызовом других функций, но я о нём не знаю)
 

fixxxer

К.О.
Партнер клуба
в php5.3 - __callStatic, если тебе надо статические вызовы перекидывать

а вообще классический обсервер чем не подходит то

-~{}~ 10.10.08 11:13:

а дошло что тебе надо

недообсервер :))

ну как то так я бы сделал

PHP:
class System { function exec() { echo "[exec]\n"; }}

class Dispatcher {

    protected $object;

    function __construct($o) {
        if (!is_object($o)) throw new Exception('wtf?');
        $this->object = $o;
    }

    function __call($m, $arg) {
        System::exec();
        return call_user_func_array(array($this->object, $m), $arg);
    }
}

// real class
class _test { 
    function test1() { echo "boo!\n"; }
    function test2() { echo "booboo!\n"; }
}

// dispatcher
class test extends Dispatcher {
    function __construct() {
        parent::__construct(new _test);
    }
}]

$T = new test;
$T->test1();
$T->test2();
 

dr-sm

Новичок
такая штука называется before call advise в AOP (Aspect-oriented programming).
в пхп с этим вроде пока туго.
хотя вот есть какой-то екстеншн:
http://code.google.com/p/php-aop/

-~{}~ 10.10.08 11:18:

fixxxer, это скорее прокси, чем недообзервер :)
 

fixxxer

К.О.
Партнер клуба
ну так то да

а вообще для аоп-фишек можно взять тот же ранкит. хотя это хак :)
 

Stierus

Новичок
PHP:
// real class
class _test { 
    function test1() { echo "boo!\n"; }
    function test2() { echo "booboo!\n"; }
}

// dispatcher
class test extends Dispatcher {
    function __construct() {
        parent::__construct(new _test);
    }
}]
С этой городьбой я это сам реализовал бы, но мне необходим именно вид

PHP:
// real class
class _test { 
    function test1() { echo "boo!\n"; }
    function test2() { echo "booboo!\n"; }
}
на крайний случай

PHP:
// real class
class _test  extends Dispatcher{ 
    function test1() { echo "boo!\n"; }
    function test2() { echo "booboo!\n"; }
}
Поподробнее про ранкит можно?
 
Сверху