たとえば、ユーザーが名前と年齢をクエリ条件として送信できるクエリ サービスを提供しています。
名前が「laruence」、年齢が 27 歳の人にクエリを実行したいとします。この人によって定義されたクエリ トークンは次のように記述できると思います:
ラルーエンス=27
残念ながら、そのようなトークンがクエリ文字列としてサーバーの処理スクリプトに送信されると、「えー、ユーザー名が何なのかわからない、、、
さて、それでは次のように書く必要があります:
ユーザー名=ラルエンス&年齢=27
それで、変数の名前を取得できますか?
まずは可能性から分析してみます
C 言語では、すべてのシンボルがコンパイラによって「置換」されることがわかっています。
PHP では、すべての変数は「シンボル テーブル」と呼ばれる HastTable 構造に格納され、解析および実行のプロセス中にも「シンボル」情報が保持されるため、確実に取得できます。
PHP では、シンボルのスコープはアクティブなシンボル テーブルに関連付けられます。同時に、アクティブなシンボル テーブルは 1 つだけです。では、アクティブなシンボル テーブルとシンボル テーブルを理解するにはどうすればよいでしょうか?
PHP の場合、現在アクティブなシンボル テーブルはグローバル変数 EG (active_symbol_table) に格納されます。同時に、関数呼び出しの実行本体に入る前に、グローバル シンボル テーブルも EG (symbol_table) に格納されます。新しい active_symbol_table を作成し、呼び出しスタック スタイルのシンボル テーブル スタック: EG (symtable_cache) を維持します。これにより、関数呼び出しを終了するときに、以前のアクティブなシンボル テーブル (スコープ) を復元できます。
同時に、PHP ではスコープの継承が実装できません。つまり、スコープ外のシンボルに直接アクセスすることができず (グローバル宣言を追加する必要があります)、グローバル宣言を追加すると、現在のディレクトリにコピーが生成されます。つまり、現在のスコープに表示されないシンボルは、グローバル シンボル テーブルに保存されます。
上で分析したように、必要な変数の名前は、現在アクティブなシンボル テーブル
で見つけるだけです。もちろん、これらだけでは十分ではありません。PHP スクリプトで現在のシンボル テーブルを取得するにはどうすればよいでしょうか?
get_define_vars
ただし、注意すべき問題があります。つまり、get_define_vars は、現在アクティブなシンボル テーブルで定義されている変数名を返します。つまり、次のような関数をラップする必要がある場合です。
get_変数名($var)
また、この関数の get_define_vars を通じて get_variable_name が呼び出されたときにシンボル テーブルを取得しようとしても機能しません。
したがって、変数名を取得する関数は次のようになります:
現在アクティブなシンボル テーブルを取得したので、変数の名前を取得するにはどうすればよいでしょうか?
明らかに、変数の値に基づいてこのテーブルをクエリし、探している値と同じ値を持つ変数を見つける必要があります。ただし、これには別の問題があります。つまり、等しい値を持つ変数が複数存在する可能性があります。価値観?
get_variable_name(&$var, $scope)
次に、関数本体を改善しましょう:
function get_variable_name(&$var, $scope = NULL) {
if (NULL == $scope) {
}
$tmp = $var;
$var = "tmp_exists_" . mt_rand();
$name = array_search($var, $scope, TRUE);
$var = $tmp;
$name を返します;
}
さらに、複数の変数間に参照がある場合、この関数は最初に定義された変数名しか返さないという問題があります。
さらに、http://php.net/manual/en/ language.variables.php
も参照できます。