0

デストラクタで呼び出された関数名を取得することは可能ですか?

class My_class {

    function my_func() {
        echo 'Hii';
    }

    function your_func() {
        echo 'Hii';
    }

    function __destruct() {
        echo $the_called_func_name;
    }
}


$bar = new my_class();
$bar->my_func();

my_funcデストラクタで名前「 」を取得することは可能ですか?

使用した場合

echo __FUNCTION__;

それは与えるでしょう

__destruct

私が欲しい

my_func
4

3 に答える 3

2

はい、可能です。は動的であるためmy_func、関数のオーバーロード (別名マジック メソッド) を使用できます。__call()

class My_Class
{

   private $methods = array(); 


   public function __call($method, array $args)
   {
      array_push($this->methods, $method);
   }

   public function getMethods()
   {
      return $this->methods;
   }

   public function __destruct()
   {
      // Off course, you should improve this 
      print_r($this->getMethods());
   }
}

// Usage:

$foo = new My_Class();
$foo->my_func(); // Output Array(0 => 'my_func')
于 2013-03-23T10:00:55.450 に答える
1

どの関数がアクセスされたかをログに記録するためだけです。各関数でログ関数を呼び出す代わりに。

メソッドにコードを追加したり、デバッグとプロファイリング用の別のツールを使用したりしない限り、これは簡単には不可能です。

提案されたソリューションは__call、既存のパブリック メソッドでは機能しないことに注意してください。最終的には、log(__METHOD__)各メソッドに追加するよりも複雑になります。

あなたが探しているのは、基本的に PHP でひどくサポートされていないAspect Oriented Programming (AOP)です。フレームワーク Flow3 は、アノテーションとリフレクションを使用してアスペクトを動的に追加します。Logging Exampleは、ユースケースの完璧な例です。

namespace Example\MyPackage;

/**
 * A logging aspect
 *
 * @Flow\Aspect
 */
class LoggingAspect {

        /**
         * @var \TYPO3\Flow\Log\LoggerInterface A logger implementation
         */
        protected $logger;

        /**
         * For logging we need a logger, which we will get injected automatically by
         * the Object Manager
         *
         * @param \TYPO3\Flow\Log\SystemLoggerInterface $logger The System Logger
         * @return void
         */
        public function injectSystemLogger(\TYPO3\Flow\Log\SystemLoggerInterface ⏎
                $systemLogger) {
                $this->logger = $systemLogger;
        }

        /**
         * Before advice, logs all access to public methods of our package
         *
         * @param  \TYPO3\Flow\AOP\JoinPointInterface $joinPoint: The current join point
         * @return void
         * @Flow\Before("method(public Example\MyPackage\.*->.*())")
         */
        public function logMethodExecution(\TYPO3\Flow\AOP\JoinPointInterface $joinPoint) {
                $logMessage = 'The method ' . $joinPoint->getMethodName() . ' in class ' .
                        $joinPoint->getClassName() . ' has been called.';
                $this->logger->log($logMessage);
        }
}

重要な行は次のとおりです。

@Flow\Before("method(public Example\MyPackage\.*->.*())")

名前空間logMethodExecutionの任意のクラスのメソッド呼び出しの前に呼び出すようにフレームワークに指示します。Example\MyPackage

だから、Flow3を使えばそれができます。しかし、AOP フレームワークなしで自分で同様の動作を実装すると、必ず失敗します。

于 2013-03-23T14:21:16.880 に答える
0

はい、

class My_class {

    function my_func() {
        echo 'Hii';
    }

    function your_func() {
        echo 'Hii';
    }

    function __destruct() {
        self::my_func();
        // my_func called
    }
}


$bar = new my_class();
$bar->my_func();

関数名を意味する場合は__call、オブジェクト関数と__callStatic静的関数を使用します。

于 2013-03-23T09:54:47.923 に答える