2016-06-25 2 views
2

나는 PHP 마술 방법을 검토해 왔지만 이것을 달성하기위한 방법은 적어도 없습니다.php - 모든 클래스의 메소드를 마술처럼 호출하는 방법은 무엇입니까?

어떤 클래스가 인스턴스화 될 때 "마법처럼"메서드를 호출하고 싶습니다. 구체적으로 클래스에 작성되지 않은 __onClassCall()과 같은 것입니다. 디버깅을 위해이 클래스를 켜거나 끕니다. 마찬가지로 클래스의 메서드가 호출 될 때 다른 메서드를 호출하고 싶습니다.이 메서드는 다시 다른 어딘가에 쓰여지고 켜지거나 꺼질 수 있습니다. 이것이 가능한가?

+0

'반사'를 시도 했습니까? [ReflectionMethod :: invoke] (http://php.net/manual/en/reflectionmethod.invoke.php)를보십시오 – postrel

+0

* debug backtrace *를 찾으십시오 - 당신이 찾고있는 것일 수도 있습니다. 예 : http://stackoverflow.com/a/8497530/2329487 – shudder

+0

Aop 프레임 워크를 사용할 수 있습니다. https://github.com/goaop/framework – sectus

답변

0

직접 구현할 수도 있습니다. 어쨌든 마법 계책은 명시 적으로 트리거해야하기 때문에 필요하지 않은 것일 수도 있습니다 (__invoke()). 아래에있는 클래스의 마법 코드를 선언 한 다음 클래스 (여기서는 SomeClassOne)에서 사용하는 코드를 생각해보십시오. 이것은 내장 된 PHP 함수가 아닐 수도 있지만 OOP의 전부입니다. 맞습니까?

<?php 

     class MagicHelper{ 

      public static function __onClassCall(){ 
       // LOGIC FOR SOME SPECIAL INITIALIZATION ON THE INSTANTIATION OF A CLASS OBJECT GOES HERE... 
       // THIS METHOD IS FIRED EACH TIME AN OBJECT IS INSTANTIATED 
      } 

      public static function __onMethodCall(){ 
       // LOGIC FOR DEBUGGING GOES HERE... 
       // THIS METHOD IS FIRED EACH TIME A METHOD IS CALLED 
      } 
     } 


     class SomeClassOne{ 
      private $prop; 

      public static $CLASS_PREP_ENABLED  = true; //<== COULD BE TURNED OFF OR ON 
      public static $METHOD_DEBUG_ENABLED  = true; //<== COULD BE TURNED OFF OR ON 

      public function __construct($prop = null) { 
       $this->prop  = $prop; 

       if(self::$CLASS_PREP_ENABLED){ 
        // CALL THE STATIC MAGIC __onClassCall METHOD DECLARED IN THE MagicHelper CLASS 
        // EACH TIME A NEW OBJECT IS INSTANTIATED 
        MagicHelper::__onClassCall(); 
       } 
      } 

      function __invoke() { 
       // YOU COULD AS WELL USE THIS BUT I DOUBT THIS FITS YOUR DESCRIPTION. 
      } 

      public function getProp() { 
       return $this->prop; 
      } 

      public function setProp($prop) { 
       $this->prop = $prop; 
       return $this; 
      } 

      public function methodOne($paramOne){ 
       // THE LOGIC FOR THIS METHOD GOES HERE 
       //... 
       // CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS 
       // EACH TIME A NEW OBJECT IS INSTANTIATED 
       if(self::$METHOD_DEBUG_ENABLED) { 
        MagicHelper::__onMethodCall(); 
       } 

      } 

      public function methodTwo($paramTwo){ 
       // THE LOGIC FOR THIS METHOD GOES HERE 
       //... 
       // CALL THE STATIC MAGIC __onMethodCall METHOD DECLARED IN THE MagicHelper CLASS 
       // EACH TIME A NEW OBJECT IS INSTANTIATED 
       if(self::$METHOD_DEBUG_ENABLED) { 
        MagicHelper::__onMethodCall(); 
       } 
      } 
     } 
관련 문제