простая система "плагинов" с использованием __call - PullRequest
1 голос
/ 02 февраля 2012

пока, у меня есть это:

class Foo{

  private $plugin_methods = array();

  public function registerPlugin($caller, $method){
    list($object, $caller) = explode('.', $caller);
    $this->plugin_methods[$object][$caller] = $method;   
  }

  public function _doPluginMethod($object, $name, $args){

    if(isset($this->plugin_methods[$object][$name]))
      return call_user_func_array($this->plugin_methods[$object][$name], $args);

    throw new Exception("Method '{$name}' not defined for '{$object}'.");
  }


  public function __call($name, $args){
    return $this->_doPluginMethod('foo', $name, $args);
  }

}

и теперь я могу сделать это:

$foo = new Foo();

$foo->registerPlugin('foo.my_plugin', function($something){
  return $something * 1000;
});

$foo->my_plugin(3453245);

Но как мне добраться до объекта $this внутри моей функции "плагина"?

1 Ответ

1 голос
/ 02 февраля 2012

Зависит от версии PHP, которую вы используете.Начиная с PHP 5.4, возможно использование $this в анонимных функциях (также называемых замыканиями).До этого не было.

Проверьте список изменений здесь: http://php.net/manual/en/functions.anonymous.php

...