【2021/10/15 追記】
この記事は更新が停止されています。PHP 8.x 以降での動作保証はありません。過去の記事として参考程度にご覧ください。
初心者の頃何故かこういうことやりたがってたなぁ・・・
絶対実用アプリケーション開発でやっちゃだめよ!!!
変数シンボルの管理ぐらいプログラマの脳ミソでやるべきであって、プログラムにやらせるべきじゃない。
ちなみにグローバルスコープ限定という悲惨な縛りつき。
既にその変数が他の変数とリファレンス状態であったときもどっちの名前が返るか分からない。
<?php
function get_var_name(&$var) {
$tmp = $var;
$var = new stdClass;
$name = null;
foreach ($GLOBALS as $k => $v) {
if ($v === $var) {
$name = $k;
break;
}
}
$var = $tmp;
return $name;
}
$hoge = 'foo';
var_dump(get_var_name($hoge)); // string(4) "hoge"
追記: get_defined_vars
で得る値を渡すことを要求すれば任意のスコープに対応できます。
改良版
<?php
function get_var_name(&$var, array $scope = null) {
$tmp = $var;
$var = openssl_random_pseudo_bytes(100);
$name = null;
if ($scope === null) {
$scope = $GLOBALS;
}
foreach ($scope as $k => $v) {
if ($v === $var) {
$name = $k;
break;
}
}
$var = $tmp;
return $name;
}
$hoge = 'foo';
var_dump(get_var_name($hoge)); // string(4) "hoge"
call_user_func(function () {
$fuga = 'foo';
var_dump(get_var_name($fuga, get_defined_vars())); // string(4) "fuga"
});