2011-01-28 5 views
0

関数内から関数が呼び出されるスコープを決定する方法はありますか? (または方法;私はポストの残りの部分のいずれかを意味する関数を使用します。)PHPの呼び出しスコープを決定する

私は何を望んでいないことは、関数に__FILE__または__CLASS__定数を渡すことです。この情報はスタックトレースなどで利用できるので、どこかに浮かんでいることはわかっていますが、実行時に例外をスローせずにイントロスペクションする方法を知りたいと思います。

ソリューションのパフォーマンスの特殊性がある場合は、私は同様にそれらについて知りたいのです。

私が興味2ユースケースがあります。

  1. ファイル/行/関数は、関数呼び出し

を発したクラス型を決定し

  • 私の関数を呼び出した決定基本的に私が欲しいのはこれです:

    class util 
    { 
        public static function checkScope() 
        { 
         echo $magic_scope_stuff; 
        } 
    
        public static function blah() 
        { 
         util::checkScope(); 
        } 
    } 
    
    util::checkScope(); // main, line 14 
    util::blah(); // class util, line 9 
    
  • +2

    [別のクラスのメソッドと呼ばれているクラスを見つける。]の可能複製(http://stackoverflow.com/questions/1214043/find-out-which-class-called-a-method-in-another-クラス) – Gordon

    +1

    この質問は、今は毎回尋ねられ、そのためにいくつか重複があるはずです。もしそれを必死にしたいのであれば、 'debug_backtrace'を乱用しますが、一般的に、その必要性を持つことはデザインの匂いです。 http://marc.info/?l=php-internals&m=125313473914294&w=3 – Gordon

    +1

    @Gordon読み物をありがとう:PHPに、このような機能を実装するには、同様php.internalsに議論され、拒否されました。 – cbednarski

    答えて

    3

    ありがとうございますそれのために。

    結果の配列は、あなたのdebug_backtraceの呼び出しまでのエントリポイントからのコールトレースを提供します。

    +2

    実際には 'debug_backtrace'はデバッガであり、呼び出し元スコープを取得しません。それは可能ですが、アプリケーションの流れを制御する機能は間違いありません。 – Gordon

    +0

    @Gordon真実。これは、デバッグ情報を取得するためのものです。したがって接頭辞。私はそれを推奨しません(例外と同じオーバーヘッド)が、フロー制御に使用することは可能です。 –

    +0

    @Gordonはい、それは私が作成しようとしていた区別です。ありがとう。 – cbednarski

    関連する問題