문제

나고를 잡는 방법이 어떤 방법이라고에 있는 객체에 대 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
   }
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top