21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

変数名自体を取得する

Last updated at Posted at 2013-08-08

【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"
});
21
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?