2017-10-03 26 views
1

私はPHPを初めて使いこなし、php.netから学んでいます。誰がスタックと何故私たちはなぜgetTrace()メソッドをPHPで使用するのですか?PHPでgetTrace()メソッドは何をしますか?スタックとは何ですか?

私は次のコードを使用する場合:

try{ 
    throw new Exception("Custom exception"); 
}catch(Exception $e){ 
    echo print_r($e->getTrace(),true); 
} 

をそれは、次の

Array() 

を返し、誰もがgetTrace(何言うことができる)方法は、PHPでいますか?スタックとは何ですか?

+2

短い答え: 'getTrace()'は、例外が発生したポイントに到達するために渡された関数のリストと、その関数を呼び出したファイルと行を含む配列を返します。詳細については、['debug_backtrace()'](http://php.net/manual/en/function.debug-backtrace.php)関数を参照してください。 – rickdenhaan

+0

なぜグローバルスコープで呼び出されたときに何も返されないのですか? –

+0

スタックとは何ですか? –

答えて

1

関数を呼び出すと、PHPは呼び出し元のコードの場所を追跡し、その関数を終了するときにどこに戻るかを知ることができます。別の関数内からある関数を呼び出す場合でも、関数呼び出しのレコードとしてスタックを使用します。

例えば

Iは、次のコードがある場合:

1. function a($value1, $value2) { 
2. return $value1/$value2; 
3. } 
4. 
5. function b($value1) { 
6. return a($value1/12); 
7. } 
8. 
9. echo b(12); 

をライン9への参照をPHPコードとコールのラインがb()機能することを実行する際にスタックにpuhedします。関数b()が関数a()を呼び出すと、6行目への参照がスタックにプッシュされます。関数a()がリターンを実行すると、スタックを調べ、6行目(スタックの最後のエントリ)からコードを実行し続ける必要があることがわかります。そのスタックエントリを削除し、関数b()からの復帰である6行目の残りのコードの実行を続行するので、スタックをもう一度見て9行目の参照が見つかるので、それを実行し続ける必要があることがわかります。コードを再び9行目から削除し、スタックからそのエントリを削除し、9行目から実行を続けます。

スタックは、関数に渡されるすべての引数の詳細を保持するためにも使用されるため、詳細情報をたくさん保持します。

getTrace()は、スタック内にある参照点と関数に渡される引数をすべてリストします。

+0

私はこのメソッドをクラスで使用しましたが、クラス名とそのメソッド名を** getTrace()**が呼び出された場所から返します。 –

+0

はい、getTrace()は他の関数と同様の関数なので、getTrace()自体の呼び出しもスタックにプッシュされます –

+0

いいえ、クラス名を返すことはできません。 ** getTrace()**が呼び出されます。 –

関連する問題