がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

文字列で変数名が展開されるパターン

きっかけは本日の講義でもらった質問。


PHPで、ダブルクォート内の変数が展開される、ってのはあって。
{}を入れないと「$に続く、有効な変数名を形成することが可能な最長のトークンを取得する」ってのが基本ざんす。
なので、以下は…

<?php

$a = 1;
$ab = 2;
$abc = 3;

$s = "$abcdefg";
var_dump($s);

string(0) ""

こうなりまふ。


なので、通常{}を使って「明示する」ほうが楽ができるんでござんす。

<?php

$a = 1;
$ab = 2;
$abc = 3;

$s = "{$ab}cdefg";
var_dump($s);

string(6) "2cdefg"


さて。質問があったのは、以下のパターン。参考書に書いてあるらしい。

<?php

$a = 1;
$ab = 2;
$abc = 3;

$s = "${ab}cdefg";
var_dump($s);

ふむ…まぁ実験。

string(6) "2cdefg"

あ、でた。
調べた。


http://www.php.net/manual/ja/language.types.string.php

// うまく動作します。出力: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

なるほろ。


ただ、上述URIのサンプルコードを眺めるに

// 動作します
echo "This square is {$square->width}00 centimeters broad.";
// 動作します。クォートしたキーを使う場合は、波括弧構文を使わなければなりません
echo "This works: {$arr['key']}";
// 動作します
echo "This works: {$arr[4][3]}";

なんか全体的に「$を含めて波括弧に含めてる」なぁ。
配列とかの時に不具合でも起きるのかしらん?


実験。

<?php

$awk['key'] = '000';
$s = "${awk['key']}cdefg";
var_dump($s);

string(8) "000cdefg"

あ、以外といけた。


ん…なんとなく「どっちでもいい」ように見えるなぁ。
おいちゃんの好みは「$を含めて波括弧の中」なんだけど、その辺はどうも「好みと好き好き」な気がしてきた。


ん?クラスは?

<?php

class hoge {
  public $datum_;
}

$obj = new hoge();
$obj->datum_ = 10;

$s = "${obj->datum_}cdefg";
var_dump($s);

Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in /home/gallu/t.php on line 10

あぁこのパターンでエラーになるのか。


一応念のため。

<?php

class hoge {
  public $datum_;
}

$obj = new hoge();
$obj->datum_ = 10;

$s = "{$obj->datum_}cdefg";
var_dump($s);

string(7) "10cdefg"

まぁそうだねぇ。


ん…あんまり複雑なことしなきゃどっちでもいい気がするんだけど。
まぁ「$も波括弧ん中に入れておいた方が汎用的」な、気は、する。
とはいえこんな構文で「ンな複雑なこと」やっても、ってのがまず第一にあるとは思うんだけど(苦笑