変数
初心者向けとしては珍しく大きな問題の見当たらない、手堅く纏まってる記事ですが、変数名の部分は明白に誤っています。
まず、必ず「 $(ドルマーク) 」を先頭につけます。その後に、変数の名前を続けます。変数名として、「 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 '$'