Ну, один путь, должен был бы сделать все вызовы методов "виртуальный":
class Foo {
protected $overrides = array();
public function __call($func, $args) {
$func = strtolower($func);
if (isset($this->overrides[$func])) {
// We have a override for this method, call it instead!
array_unshift($args, $this); //Add the object to the argument list as the first
return call_user_func_array($this->overrides[$func], $args);
} elseif (is_callable(array($this, '_' . $func))) {
// Call an "internal" version
return call_user_func_array(array($this, '_' . $func), $args);
} else {
throw new BadMethodCallException('Method '.$func.' Does Not Exist');
}
}
public function addOverride($name, $callback) {
$this->overrides[strtolower($name)] = $callback;
}
public function _doSomething($foo) {
echo "Foo: ". $foo;
}
}
$foo = new Foo();
$foo->doSomething('test'); // Foo: test
PHP 5.2:
$f = create_function('$obj, $str', 'echo "Bar: " . $obj->_doSomething($str) . " Baz";');
PHP 5.3:
$f = function($obj, $str) {
echo "Bar: " . $obj->_doSomething($str) . " Baz";
}
Все РНР:
$foo->addOverride('doSomething', $f);
$foo->doSomething('test'); // Bar: Foo: test Baz
Она проходит экземпляр объекта в качестве первого метода к «переопределение». Примечание. Этот метод «overriden» не будет иметь доступа к защищенным членам класса. Поэтому используйте геттеры (__get
, __set
). Она будет иметь доступ к защищенным методам, так как фактический вызов приходит от __call()
...
Примечания: Вам нужно изменить все стандартные методы, которые будут начинаться с «_» для этой работы. .. (или вы можете выбрать другую опцию префикса, или вы можете просто охватить все их защищенные) ...
Я не думаю, что то, что вы хотите, возможно. Я мог ошибаться, но в целом * Reflection APIs * используются для ** получения ** информации о классах и т. Д., А не для изменения кода во время выполнения. –
дайте дополнительную информацию о том, что вы пытаетесь сделать, и, может быть, мы сможем помочь найти другое решение. – Galen
Хотя я уверен, что есть решение для этого, и вы знаете, что вам это нужно - вы уверены, что это то, что вы хотите? Почему вы хотите изменить характер функции во время выполнения? Лучшим вариантом может быть передача переменной, управляющей потоком функций; или, возможно, рассмотрите использование операторов eval() для запуска кода. Подумайте об этом так: как вы называете функцию, которая не имеет предопределяемого эффекта? – Kurucu