를 잡는 방법이 어떤 메소드 호출에 개체 PHP?
-
15-09-2020 - |
문제
나고를 잡는 방법이 어떤 방법이라고에 있는 객체에 대 PHP.내가 알고있는 마법에 대해 기능 __call
, 지만,그것은 트리거만을 위한 방법에 존재하지 않는 이라는 개체입니다.
예를 들어 내가 뭔가를 다음과 같다:
class Foo
{
public function bar()
{
echo 'foobar';
}
public function override($method_name,$method_args)
{
echo 'Calling method ',$method_name,'<br />';
$this->$method_name($method_args); //dirty, but working
}
}
그 때 나는 이것:
$foo = new Foo();
$foo->bar();
내가 이것을 원하 출력:
Calling method bar
foobar
대신 이 하나의:
foobar
어떤 방법이 어떻게 하면 이렇게 할 수 있습니까?도하십시오:)
해결책
인 원 Foo
구현할 수 있 포장 decorator
그것의 주위에 다음과 같다:
class Foo
{
public function bar() {
echo 'foobar';
}
}
class Decorator
{
protected $foo;
public function __construct(Foo $foo) {
$this->foo = $foo;
}
public function __call($method_name, $args) {
echo 'Calling method ',$method_name,'<br />';
return call_user_func_array(array($this->foo, $method_name), $args);
}
}
$foo = new Decorator(new Foo());
$foo->bar();
다른 팁
객체 주위의 객체를 래핑하고 모든 통화를 가로 채고 원래 개체에서 전달하고 결과를 반환 할 수 있습니다.
래퍼 클래스의 변수로 객체를 저장하고 래퍼 클래스의 오버로드 메서드를 사용하여 객체를 호출 / 설정 / 확인 / 확인합니다.
$object = new AnyObject;
$object = new Wrapper($object);
$object->anyMethod();
$object->anyVar = 'test';
echo $object->anyVar;
echo $object['array form'];
.
foreach에서 래퍼 클래스를 반복하는 것은 아마도 어렵습니다.Havent는 그것을 시도했습니다.
함수를 비공개로 설정하면 외부에서 호출이 __call에 갇히게됩니다.
내부에서 호출 할 수 있습니다.class Foo
{
private function bar()
{
echo 'foobar';
}
public function __call($method_name,$method_args)
{
echo 'Calling method ',$method_name,'<br />';
$this->$method_name(); //dirty, but working
}
}
. 제휴하지 않습니다 StackOverflow