はじめに
このコードはネタコードです。
$a ~ $zの変数について、ワンライナーで定義したいと思います。格納する値は5です。
ワンライナー
$a = ( $b = ( $c = ( $d = ( $e = ( $f = ( $g = ( $h = ( $i = ( $j = ( $k = ( $l = ( $m = ( $n = ( $o = ( $p = ( $q = ( $r = ( $s = ( $t = ( $u = ( $v = ( $w = ( $x = ( $y = ( $z = 5 )))))))))))))))))))))))));
出力すると
$ php -a
Interactive shell
php > $a = ( $b = ( $c = ( $d = ( $e = ( $f = ( $g = ( $h = ( $i = ( $j = ( $k = ( $l = ( $m = ( $n = ( $o = ( $p = ( $q = ( $r = ( $s = ( $t = ( $u = ( $v = ( $w = ( $x = ( $y = ( $z = 5 )))))))))))))))))))))))));
何も出力されず終わります。
get_defined_vars()
で中身を確認
$a ~ $zがちゃんと定義されているか、その中身をget_defined_vars()
の出力で確認してみましょう。
php > $a = ( $b = ( $c = ( $d = ( $e = ( $f = ( $g = ( $h = ( $i = ( $j = ( $k = ( $l = ( $m = ( $n = ( $o = ( $p = ( $q = ( $r = ( $s = ( $t = ( $u = ( $v = ( $w = ( $x = ( $y = ( $z = 5 )))))))))))))))))))))))));
php > var_dump(get_defined_vars());
array(33) {
["_GET"]=>
array(0) {
}
...
["a"]=>
int(5)
["b"]=>
int(5)
["c"]=>
int(5)
["d"]=>
int(5)
["e"]=>
int(5)
["f"]=>
int(5)
["g"]=>
int(5)
["h"]=>
int(5)
["i"]=>
int(5)
["j"]=>
int(5)
["k"]=>
int(5)
["l"]=>
int(5)
["m"]=>
int(5)
["n"]=>
int(5)
["o"]=>
int(5)
["p"]=>
int(5)
["q"]=>
int(5)
["r"]=>
int(5)
["s"]=>
int(5)
["t"]=>
int(5)
["u"]=>
int(5)
["v"]=>
int(5)
["w"]=>
int(5)
["x"]=>
int(5)
["y"]=>
int(5)
["z"]=>
int(5)
}
きちんと定義できていることが確認できました。
説明
phpの式について調べていたら、こんな記述を見つけました。
代入式は、それ自体、代入値を評価します。 この場合、その値は 5 になります。 このことは、実際には、
$a = 5
は、それが何をするかによらず、 値 5 を有する式であることを意味します。 つまり、$b = ($a = 5)
のように書くことは、$a = 5; $b = 5;
と書くのと 同様なのです。
ref: https://www.php.net/manual/ja/language.expressions.php
phpにおける式の定義は、"値のあるもの全て"です。
代入式もこの定義に漏れず値を持っています。$a = 5;
の代入式それ自体が持つ値は5であり、$b = ( $a = 5 );
と記載した場合、それはすなわち$a = 5; $b = 5;
と同意となります。
ということで、それを$a ~ $zまで入れ子にして繰り返したのが、本ワンライナーでした。
追記
この長い式も、値を持っています。
再帰的に処理され、最終的には$a = 5
という式になります。
php > echo $a = ( $b = ( $c = ( $d = ( $e = ( $f = ( $g = ( $h = ( $i = ( $j = ( $k = ( $l = ( $m = ( $n = ( $o = ( $p = ( $q = ( $r = ( $s = ( $t = ( $u = ( $v = ( $w = ( $x = ( $y = ( $z = 5 )))))))))))))))))))))))));
5
"echo"で式自体の値を吐き出させると、5が出力されます。
おわりに
本ワンライナーは思いつきで書いたネタコードです。
プロダクトのコードではこんなことはせずに配列を使いましょう。
追記
よければコメント欄もご覧ください。