こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHPの言語仕様について

PHPのマニュアルを読んでいるのですが、以下の項目について説明が見つけられないでいます。

「()」や「{}」についての仕様が明記されていないようなのです。
他の言語では「()」は演算子の一つだったり、セパレーターの一つだったりしますが、PHPのマニュアルを私が読んだ限りではそのどちらとしても記述がありません。
また、「{}」については、rubyなどでいうブロックを形成するものではなく、if文やfor分で複文を実行するときにのみ使用される、ということのようですが、これ以上詳細な説明が見つけられませんでした。

PHPの言語仕様としては、マニュアルの他にドキュメントが有るのでしょうか?
もしくはソースを読む必要があるのでしょうか?

※私が読んでいるのは日本語版のマニュアルです
 http://www.php.net/manual/ja/index.php

タイトル修正して質問しなおしました

投稿日時 - 2009-07-02 11:49:12

QNo.5092030

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

えーっと、私もそのあたり詳しくは知っているわけでは無いのですが、
少し前にそれに関係がありそうなソースの書き方を探したりしたのでその中で見つけた知識から。

{}はブロックを形成する為の要素になると思います。
if文でしたらブロックだと考えれば、ある程度説明が付くと思いますし、
ちょっと変わったコードになると、
$name = 'なまえ';
print $hoge = "今日から君は{$name}2号だ";
みたいな書き方が出来ます。
({]を使わないと、変数の次にある2までが変数解釈される為の対策になる)
また、
print $hoge = "今日から君は{md5($name.'2号')}だ";
みたいなソースでもちゃんと動きますし、関数展開だけじゃなく、ややこしい計算処理も一応可能です。

そして()は関数展開をする為の必須要素になると思いますよ。
ソースコードを書く時によくその場のノリで
$atama = $mb_substr($name,0,1,'UTF-8');
と書いて「そんな関数無いよ」とエラーが帰ってきた経験があると思います。
つまり変数名の後に()が付くと「関数でしょ?でも、その名前存在しないからエラーね」
みたいに解釈しているのです。
そこで、さっきのエラー部分の前の行に
$mb_substr = 'mb_substr';
と追加すると、
$mb_substr($name,0,1,'UTF-8');
の部分は、
mb_substr($name,0,1,'UTF-8');
と解釈されて、きちんと狙った通りに動いてくれるのです。

さらにとんでもないソースコードですが、
$name2 = 'name2';
$func = 'substr';
${'head_'.$func($name2,0,1)}[] = $name2;
var_dump($head_n);
こんなソースを書くと、
'head_'.$func($name2,0,1)
で解釈されて帰ってくる結果の文字列を変数として定義する事が出来ます。


具体的な答えではなく推測みたいな感じですが、
PHPではこういう類の仕様まで存在しています。

投稿日時 - 2009-07-05 01:26:39

補足

ありがとうございます

「{」については制御構文でのブロック、のほかにも明示的にコードの切れ目を指定することができるのですね。たしかに、そうなのですが、どうも腑に落ちません。

「(」についてはそうですね。可変関数である、という目印に「(」を使っている、というか、変数の後ろに「(」がついていると関数として処理しようとしますね。

この「{」にしても「(」にしても、式の中で使う、文の中で使う、など条件によっていろいろ使われ方が変わってくるからマニュアルに統一的な説明が載っていない、ということなのでしょうか?

ここ数年PHPを使って開発をしているのですが、この辺の曖昧な(わかりやすく明記されていない)仕様が怖くなってきているところです。

もし、この辺、統一的に解説した資料など(できれば公式の)をご存知でしたら教えてください。

投稿日時 - 2009-07-06 11:28:18

あなたにオススメの質問