1

初めて呼び出された場合は異なる動作をし、残りの時間は異なる動作をするような関数を作成したいと考えています。これを行うために、「状態」変数を使用できることがわかりました。他のいくつかのテクニックもここで与えられました: 関数がまだ呼び出されているかどうかを確認してください

しかし、同僚から debug_backtrace() を使用してこの問題を解決できるというヒントを得ました。私はそれについて読みましたが、どのように理解できませんか? この関数は、関数呼び出しのスタック トレースを提供します。関数が初めて呼び出されたかどうかをどのように判断できますか?

私を困惑させる正確なコードは次のとおりです。

/**
 * Holds the states of first timers
 * @var array
 */
private static $firstTimeCSS=array();
private static $firstTimeJS=array();
/**
 * Tells whether it is the first time this function is called on 
 * ANY CLASS object or not. Useful for one-time scripts and styles
 * 
 * @param string $class name optional. Usually you should send __CLASS__ to this, otherwise the instance ($this) class would be used.
 * @return boolean
 */
final protected function IsFirstTime($class=null)
{
    $t=debug_backtrace();
    if ($t[1]['function']=="JS")
        $arr=&self::$firstTimeJS;
    else
        $arr=&self::$firstTimeCSS;


    if ($class===null)
        $class=$this->Class;
    if (isset($arr[$class]))
        return false;
    else
    {
        $arr[$class]=true;
        return true;
    }   
}
4

3 に答える 3

4

個人的には、これがどのように可能であるか、またはなぜこのようにしたいのかわかりません。そもそも、変数debug_backtrace()よりもはるかに高価だと思います。static

呼び出し間で変化するように見える唯一のバックトレース特性は、指摘したように、(関数が呼び出された場所から) 行番号です。そして、関数をループなどで実行しても、各反復で同じ行からすべてが呼び出されるため、それは変わりません。

  • デモンストレーション 1 (個別呼び出し): CodePad
  • デモ 2 (ループ): CodePad

私があなたなら、状態変数を使い続けるでしょう。あなたの同僚について言えば、彼の方法論がどのように機能するか興味があるなら、その方法論を示すコードを見せてくれるように彼に頼むことができます (私は知っています!)。

編集(コメントから):基本的に、同僚のメソッドは、と呼ばれるクラスdebug_backtrace()のキーを使用してブール値を配列に格納します。

簡単な英語では、次のようになります。

  • 呼び出し関数は「JS」と呼ばれていますか?
  • その場合は、JS ラベル付き配列に格納します。それ以外の場合は、CSS ラベル付き配列を使用します。
  • クラスが指定されているかどうかを確認します。そうでない場合は、このクラスを使用してください。
  • ラベル付き配列に特定のクラスのブール値がある場合、それは初めてではありません。
  • それ以外の場合は、指定されたクラスのブール値を true に設定します。

私はあなたが考えていることを知っています:これは意味がありません.呼び出し元の関数の名前さえ保存しません! そして、あなたは正しいでしょう。このメソッドは拡張可能ではなく、大きなオーバーヘッドがあります。

このメソッドが行うことをしたい場合は、問題のクラスで静的変数を使用して、関数が呼び出されたかどうかを追跡します。あなたの同僚の方法は、申し訳ありませんが、非効率的で効果的ではありません。

于 2013-07-14T02:59:35.810 に答える