음, 한 가지 방법, 모든 방법을하는 것은 "가상"호출
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";
}
,210
모든 PHP는 :
$foo->addOverride('doSomething', $f);
$foo->doSomething('test'); // Bar: Foo: test Baz
그것은 "오버라이드"에 대한 첫 번째 방법으로 개체의 인스턴스를 전달합니다. 참고 :이 "재정의"메서드는 클래스의 보호 된 멤버에 액세스 할 수 없습니다. 따라서 게터 (__get
, __set
)를 사용하십시오. 실제 호출이 __call()
에서 오는한지 ...,
주를 보호 방법에 액세스 할 수 있습니다 : 당신은이 작업을 위해 '_'로 시작되는 모든 기본 방법을 수정해야합니다. .. (또는 다른 접두사 옵션을 선택할 수도 있고 모두 보호 할 수 있습니다.) ...
나는 당신이 원하는 것이 가능하다고 생각하지 않습니다. 나는 틀릴 수도 있지만 일반적으로 * Reflection API *는 ** 클래스에 대한 정보를 ** 얻고 런타임에 코드를 변경하지 않는 데 사용됩니다. –
개봉하려고하는 것에 대해 더 많은 정보를 제공하고 다른 해결책을 찾을 수 있도록 도울 수 있습니다. – Galen
이것이 해결책이 될 것이며 필요한 것이 무엇인지 알고있을 것입니다. 런타임 중에 함수의 본질을 변경하려는 이유는 무엇입니까? 더 나은 옵션은 함수 흐름을 제어하는 변수를 전달하는 것입니다. 또는 eval() 문을 사용하여 코드를 실행하는 방법을 고려해보십시오. 이런 식으로 생각하십시오 : 미리 결정 가능한 효과가없는 함수의 이름을 무엇입니까? – Kurucu