呼び出された関数内から呼び出し環境のスコープにアクセスできますか?PHP関数の呼び出しスコープを取得しますか?
たとえば、ログ機能では__LINE__
にアクセスしたいが、呼び出し環境からは__LINE__
である必要があります。私はまた、呼び出し側の変数を取得するためにget_defined_vars()
を呼び出すいくつかの方法を持っていると思います。
どちらの例でも、余分な引数を必要としません。
これは可能ですか?
呼び出された関数内から呼び出し環境のスコープにアクセスできますか?PHP関数の呼び出しスコープを取得しますか?
たとえば、ログ機能では__LINE__
にアクセスしたいが、呼び出し環境からは__LINE__
である必要があります。私はまた、呼び出し側の変数を取得するためにget_defined_vars()
を呼び出すいくつかの方法を持っていると思います。
どちらの例でも、余分な引数を必要としません。
これは可能ですか?
呼び出し元の変数を取得する方法はありませんが、引数を取得できます。これは簡単にdebug_backtrace()
で行われます。
<?php
class DebugTest
{
public static function testFunc($arg1, $arg2) {
return self::getTrace();
}
private static function getTrace() {
$trace = debug_backtrace();
return sprintf(
"This trace function was called by %s (%s:%d) with %d %s: %s\n",
$trace[1]["function"],
$trace[1]["file"],
$trace[1]["line"],
count($trace[1]["args"]),
count($trace[1]["args"]) === 1 ? "argument" : "arguments",
implode(", ", $trace[1]["args"])
);
}
}
echo DebugTest::testFunc("foo", "bar");
、我々はこの出力を得る:
This trace function was called by testFunc (/Users/mike/debug.php:23) with 2 arguments: foo, bar
debug_backtrace()
は配列を返します。要素0は関数自体が呼び出された関数なので、この例では要素1を使用します。ループを使用して、トレースを完全にバックアップすることができます。
プロダクションコードで使用するのが賢明ではありません。
どちらの例でも、余分な引数を必要としません。
これは、関数が持つ暗黙のカプセル化を破るので、コードを非常に理解しにくくします。
これはすべてグローバル変数を使用している可能性がありますか?
これを行うことができれば、最終的にはそれが悪い考えであることがわかります(とにかくログをとらない)。 – Nicole
@Renesis:それだけでなく。呼び出しスコープを取得できると、パラメータを渡す目的が完全に無効になります。 – pyon
スタックフレームで定義されている変数を一番上の変数の下に置くことはできないと思います。 – GWW