2016-06-25 9 views
2

私はPHPマジックメソッドを見直しましたが、少なくともこれを達成するための方法はありません。php - すべてのクラスのメソッドを魔法のように呼び出す方法はありますか?

具体的にどのクラスにも書かれていない、何らかのクラスがインスタンス化されたときに、メソッドが「魔法のように」呼び出されたいと思っています。これはデバッグのためのもので、私はそれをオンまたはオフにしたいと思います。同様に、クラス内のメソッドが呼び出されたときに、別のメソッドを呼び出すこともできます。このメソッドは、別の場所に書き込んでオンまたはオフにすることもできます。これは可能ですか?

+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)内で使用するMagicHelperクラスを持っている以下のコードを考えてみましょう。これは組み込みの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(); 
       } 
      } 
     } 
関連する問題