Методы PHP, которые всегда вызываются

В настоящее время я работаю над собственной PHP-MVC-Framework (только для опыта).

Мой вопрос: можно ли вызывать определенную функцию или метод каждый раз, когда вызывается метод класса?

Например:

public function view($id) {
     //Code ...
     $this->view->render(__FUNCTION__);
}

Я хочу:

public function view($id) {
    //Code ...
    //render-method is called automatically with functionname as parameter
}

Я пробовал разные методы... но безуспешно. Было бы здорово, если бы кто-нибудь помог мне с этим.

Привет, Крис


person kinkee    schedule 27.12.2010    source источник
comment
+1 за написание только для получения опыта, чтобы мы могли не читать все те ответы, которые не изобретают колесо.   -  person webbiedave    schedule 27.12.2010
comment
Кроме того, ваш класс базового/фронтального контроллера должен вызывать метод рендеринга.   -  person webbiedave    schedule 27.12.2010


Ответы (3)


Вы можете использовать магические методы для достижения такого поведения:

public function __call($func, $args) {
  if(!method_exists($this, $func)) {
    return;
  }

  // do some coding here
  call_user_func_array($func,$args);
  // do some coding there
}

private function view($arg1, $arg2) {
  // and here
}

Помните: функция просмотра должна быть закрытой/защищенной.

$obj->view("asdasd", "asdsad");

Должен делать ::__call(), затем метод ::view()

person shfx    schedule 27.12.2010
comment
Волшебная функция __call просто вызывается, если конкретная функция не определена. В приведенном выше примере, если вы вызываете view, __call не вызывается. Но если вы позвоните view1. И если функция private, у вас ошибка Fatal error: Call to private method..., не так ли? - person algorhythm; 09.07.2014

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

function call($func,$param)
{
    $this->$func($param);
    $this->render($func);
}

$myObj->call('view',$id);
person Brad Christie    schedule 27.12.2010

Вы можете использовать метод оболочки. Вызовите этот метод и передайте все остальное в качестве параметров.

person Silver Light    schedule 27.12.2010