LoginSignup
32
30

More than 5 years have passed since last update.

PHPの変数名に関するTIPS

Last updated at Posted at 2016-03-15

変数

初心者向けとしては珍しく大きな問題の見当たらない、手堅く纏まってる記事ですが、変数名の部分は明白に誤っています。

まず、必ず「 $(ドルマーク) 」を先頭につけます。その後に、変数の名前を続けます。変数名として、「 a-zA-Z(小文字・大文字) 」と 「0~9(数字)」、「_(アンダースコア)」を利用できます。大文字と小文字は区別されます。
さらに、変数名は数字から命名してはいけません。( 例: ✕ $7_seven )

使用可能な文字の実際の定義は'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'です。
http://php.net/manual/ja/language.variables.basics.php

    $ほげ = 'A';
    $  = 'B'; // 変数名がchr(246)

などは正しい変数宣言です。
まあ初心者相手にこんなこと解説する必要はないので、そういう意味では十分な表現でしょう。

あと裏技として、{}で囲むと何故か定義域以外の文字を変数名として使えます。

    ${1} = 'C';

    var_dump($1); // Parse error: syntax error, unexpected '1'
    var_dump(${1}); // C

    ${02} = 'D'; // 変数名は"2"になる

    var_dump(${2}); // D
    var_dump(${02}); // D ${2}と同じ

    ${''} = 'E'; // 変数名は""
    ${' '} = 'F'; // 変数名は" "
    ${'\''}= 'G'; // 変数名は"'"

定義したはいいものの、普通に参照することはできないので、取得時も代入時と同じように{}で括って取得します。

{}で括るのは、本来は変数名を動的に決める時に使うためのものだと思いますが、何故かこの場合の命名規則が通常の変数定義と異なります。

    ${rand(1,9)} = 'H'; // 変数名は'1'~'9'のどれか

で、この{}による代入/参照は、可変変数で全く同じように書くことができます。

    $a='ほげ';
    $$a = 'A';

    $b = ' '; // 値はchr(246)
    $$b = 'B';

    $c = 1;
    $$c = 'C';

    $d = 02;
    $$d = 'D';

    $e = '';
    $$e = 'E';

    $f = ' ';
    $$f = 'F';

    $g = '\'';
    $$g = 'G';

    $h = rand(1,9);
    $$h = 'H';

    $j = 'this';
    $$j = 'J'; // 特に関係ないが可変変数では$thisも定義できる。{}では不可。
    ${'this'} = 'J'; // Fatal error: Cannot re-assign $this

こんなの何に使うのって、forと組み合わせて数値変数名を作ったりします。
fizzbuzzでは必須のテクです。
http://qiita.com/rana_kualu/items/6f6722558fc5c8bb204a

これ以上特に話を広げられなかったのでここで終わり。

おまけ:プロパティ

    $class = new stdClass();
    $class->  = 'a'; // キーはchr(246)
    $class->1 = 'b'; // Parse error: syntax error, unexpected '1'
    $class->{1} = 'c';
    $class->{' '} = 'd';

プロパティ名のルールは特に記載がないのですが、変数名と同じ文字が使えるようです。
http://php.net/manual/ja/language.oop5.properties.php

おまけ:定数

    define(' ', 'e'); // 定数名はchr(246)
    echo  ; // e

    define('1', 'f');
    echo 1; // int(1)になる
    echo constant(1); // f

何のエラーも出さずに定数名'1'を設定可能で、get_defined_constants()でも存在を確認することができますが、困ったことに参照できません。
constant()で参照できますが、もはやdefine()した意味がありません。

    const   = 'g'; // 定数名はchr(246)
    echo  ; // g 

    const 1 = 'h'; Parse error: syntax error, unexpected '1'

constでは変数定義域外の文字を使うとパースエラーになります。
しかも{}や可変変数も使うことができないため、constで正しくない定数名を設定することはできないようです。

おまけ:クラス名

おそらくconstと同じ。
newするクラス名を動的に持つというのはよく見かけますが、クラス名自体を動的に作ることはできないようです。

    class  {} // クラス名がchr(237)
    $  = new  ;

    $j = ' '; // chr(237)
    $  = new $j;

    class {1}{} // Error: syntax error, unexpected '{'
    class $j{} // Error: syntax error, unexpected '$'
32
30
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
32
30