phpの変数や配列について確認していた2
もう少し書きたかったので、続き。
- 文字列とクオート
- 結合順
- エラー制御演算子
文字列とクオート
string型のシングルクオート('')での定義とダブルクオート("")での定義の違いについて。
シングルクオート→特殊文字(\nなど)や変数($str='変数ですよ'など)が展開されずに表示される
echo '$str \n $str';
→ $str \n $str
ダブルクオート→特殊文字や変数が展開されて表示
echo "$str \n $str";
→ 変数ですよ
変数ですよ
……というはずなのですが、自分がやってみたところではダブルクオートでも\nなどの特殊文字は展開されていないようです(「変数ですよ[半角スペース]変数ですよ」でした)。しかし、文字列変数(として整数型の変数なども)が展開されるのは、今日までいちいちピリオドを使って文字列をつないでいたことを考えるととても便利だと思います。
またバッククオート('')で文字列をくくると、その文字列の命令を外部のシェルで動作させることが出来ます。
追記
\nなどの展開される、というのを""で囲ったら、ブラウザで出力結果を表示させたとき、その特殊文字が機能している、
= "\n"をechoで入れて、phpを実行して生成されるhtmlをクロームなどのブラウザで見たとき、改行がなされている、という風に誤解してました。
なので、ブラウザで改行されていないのを見て展開されていないのかな、と勘違いしていたのですが、
こちら(http://www.php-labo.net/tutorial/php/)などで調べてみたところ、
出力されたhtmlのソースにおいて改行される、とのことで、あらためて、
<?php
$str='変数ですよ';
echo '$str \n $str';
echo "$str \n $str";
?>
というのをもっかい出力した後、htmlのソースを見たら、たしかに、
$str \n $str変数ですよ
変数ですよ
と改行が入っていたのを確認しました。
\nの特殊文字が展開される、とはhtmlのソースを見たときにタブのインデントや改行が入っている、という意味だったようです。
また、最初に誤解していたようにブラウザ上で、ソースコードの改行や半角スペースをそのまま出力させたいなら、hujiさまに教えていただいたのですが、
<pre> <?php echo "$str \n $str"; ?> </pre>
というように<pre>タグを使うとよいみたいです。
これまで<pre>タグを知らなかったのですが、<pre>内で使えないタグもあるらしいものの、ソースコードや歌詞の表示など改行や空白に大きな意味がある場合に使用すると便利みたいです。
はてなだとここがプログラムのソースだぞ、みたいな強調表示のオプションがあるのでぜひ使っていきたいところ。
結合順
複数の記号があるとき、計算をする順に()をつけていくようにして計算順をはっきりさせますが、どの記号の計算をその()の内側にするか、というのでいくつか規則があります。
左結合だと、左側の記号が()の内側になるようにするので、
$a * $b * $c * $d → ((($a * $b)* $c)*$d)
右結合だと、$a * $b * $c * $d → ($a * ($b * ($c * $d)))
となる。二項を比較する演算子==など結合しない演算子もあります。
特にphpでは三項演算子が一般的な言語と違い左結合なので注意する必要があります。
エラー制御演算子
式の前に@(エラー制御演算子)をつけることで、その式で発生しうるエラーを抑制します。
たとえば、入力フォームに入れた内容を受け取ってフォームの下に表示する簡単なphpを書くとき、
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
<form action="sample.php" method="POST">
<input type="text" name="toukou"/>
<button name="submit" type="submit" value="submit">投稿</button>
</form>
<?php
echo $_POST['toukou'];
?>
</body>
</html>
のように書くと、最初に画面が読み込まれてから投稿ボタンを押すまでは
toukouって名前の変数はセットされてない(※type="submit"のbutton要素やinput要素がクリックされることでセットされる)ので、
Notice: Undefined index: toukou in C:\xampp\htdocs\study.localhost\sample.php on line 14
という感じのエラーが出るのですが、
echo $_POST['toukou'];→echo @$_POST['toukou'];
とするとこのエラーは出ません。
でも、phpの中身を
if(isset['submit']){
echo $_POST['toukou'];
}
などと少し変えれば使う必要はなく、またエラー出てないけどバグが出る、の原因になりやすいのでこの演算子は非推奨とのことです。