文字列リテラルのいろいろ
PHPの文字列リテラルはダブルクォートで括ったりシングルクォートで括ったり、またそれらの扱い方が違うなど、いろいろとややこしいので、とりあえずいろんなパターンを作ってみた。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <table border="1"> <?php $strs_array = array( array( "label" => "ダブルクォート - 単一文字(構文エラーになるもの('\"'と'\\')は空白に置換)", "data" => array( " ", "!", " ", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "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", "[", " ", "]", "^", "_", "`", "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", "{", "|", "}", "~", ), ), array( "label" => "シングルクォート - 単一文字(構文エラーになるもの(\"'\"と'\\')は空白に置換)", "data" => array( ' ', '!', '"', '#', '$', '%', '&', ' ', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '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', '[', ' ', ']', '^', '_', '`', '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', '{', '|', '}', '~', ), ), array( "label" => "ダブルクォート - '\\'でエスケープ(のつもり(謎))", "data" => array( "\ ", "\!", "\"", "\#", "\$", "\%", "\&", "\'", "\(", "\)", "\*", "\+", "\,", "\-", "\.", "\/", "\0", "\1", "\2", "\3", "\4", "\5", "\6", "\7", "\8", "\9", "\:", "\;", "\<", "\=", "\>", "\?", "\@", "\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", "\[", "\\", "\]", "\^", "\_", "\`", "\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", "\{", "\|", "\}", "\~", ), ), array( "label" => "シングルクォート - '\\'でエスケープ(のつもり(謎))", "data" => array( '\ ', '\!', '\"', '\#', '\$', '\%', '\&', '\'', '\(', '\)', '\*', '\+', '\,', '\-', '\.', '\/', '\0', '\1', '\2', '\3', '\4', '\5', '\6', '\7', '\8', '\9', '\:', '\;', '\<', '\=', '\>', '\?', '\@', '\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', '\[', '\\', '\]', '\^', '\_', '\`', '\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', '\{', '\|', '\}', '\~', ), ), array( "label" => "ダブルクォート - 後ろに英字が続くと‥", "data" => array( " ab", "!ab", " ab", "#ab", "$ab", "%ab", "&ab", "'ab", "(ab", ")ab", "*ab", "+ab", ",ab", "-ab", ".ab", "/ab", "0ab", "1ab", "2ab", "3ab", "4ab", "5ab", "6ab", "7ab", "8ab", "9ab", ":ab", ";ab", "<ab", "=ab", ">ab", "?ab", "@ab", "Aab", "Bab", "Cab", "Dab", "Eab", "Fab", "Gab", "Hab", "Iab", "Jab", "Kab", "Lab", "Mab", "Nab", "Oab", "Pab", "Qab", "Rab", "Sab", "Tab", "Uab", "Vab", "Wab", "Xab", "Yab", "Zab", "[ab", "\ab", "]ab", "^ab", "_ab", "`ab", "aab", "bab", "cab", "dab", "eab", "fab", "gab", "hab", "iab", "jab", "kab", "lab", "mab", "nab", "oab", "pab", "qab", "rab", "sab", "tab", "uab", "vab", "wab", "xab", "yab", "zab", "{ab", "|ab", "}ab", "~ab", ), ), array( "label" => "シングルクォート - 後ろに英字が続くと‥", "data" => array( ' ab', '!ab', '"ab', '#ab', '$ab', '%ab', '&ab', ' ab', '(ab', ')ab', '*ab', '+ab', ',ab', '-ab', '.ab', '/ab', '0ab', '1ab', '2ab', '3ab', '4ab', '5ab', '6ab', '7ab', '8ab', '9ab', ':ab', ';ab', '<ab', '=ab', '>ab', '?ab', '@ab', 'Aab', 'Bab', 'Cab', 'Dab', 'Eab', 'Fab', 'Gab', 'Hab', 'Iab', 'Jab', 'Kab', 'Lab', 'Mab', 'Nab', 'Oab', 'Pab', 'Qab', 'Rab', 'Sab', 'Tab', 'Uab', 'Vab', 'Wab', 'Xab', 'Yab', 'Zab', '[ab', '\ab', ']ab', '^ab', '_ab', '`ab', 'aab', 'bab', 'cab', 'dab', 'eab', 'fab', 'gab', 'hab', 'iab', 'jab', 'kab', 'lab', 'mab', 'nab', 'oab', 'pab', 'qab', 'rab', 'sab', 'tab', 'uab', 'vab', 'wab', 'xab', 'yab', 'zab', '{ab', '|ab', '}ab', '~ab', ), ), array( "label" => "ダブルクォート - 教科書に載っているエスケープシーケンス", "data" => array( "\r", "\n", "\t", "\v", "\f", "\$", "\\", "\"", "\41", // '!'の8進表記 "\x21", // '!'の16進表記 "\'", ), ), array( "label" => "シングルクォート - 教科書に載っているエスケープシーケンス", "data" => array( '\r', '\n', '\t', '\v', '\f', '\$', '\\', '\"', '\41', // '!'の8進表記 '\x21', // '!'の16進表記 '\'', ), ), array( "label" => "ダブルクォート - 変数に関わる表記", "data" => array( "$ab", "{$ab}", "${ab}", // 変数参照として許される表記 "\{$ab}", "$\{ab}", // 中括弧('{')をエスケープ(?)してみる "\$ab", "{\$ab}", "\${ab}", // ドル記号('$')をエスケープしてみる ), ), array( "label" => "シングルクォート - 変数に関わる表記", "data" => array( '$ab', '{$ab}', '${ab}', // 変数参照として許される表記 '\{$ab}', '$\{ab}', // 中括弧('{')をエスケープ(?)してみる '\$ab', '{\$ab}', '\${ab}', // ドル記号('$')をエスケープしてみる ), ), ); $ncols = 12; foreach ($strs_array as $idx => $strs) { ?> <tr> <th colspan="<?php echo $ncols; ?>"> <?php print("(".(${idx}+1).") ".$strs['label']); ?> </th> <?php $i = 0; foreach ($strs['data'] as $str) { if ($i % $ncols == 0) { ?> </tr><tr> <?php } print("\t\t".'<td width="50">'); print('<code>'.htmlentities($str).'</code>'); print(' (<span>'.strlen($str).'</span>)'); print('</td>'."\n"); ++$i; } ?> </tr><tr> <td colspan="<?php echo $ncols; ?>"></td> </tr> <?php } ?> </table> </body> </html>
2010-0909-strings.php
で、Firefoxで表示した結果は次のとおり。
単一文字(構文エラーになるものは空白に置換)
- ダブルクォート:
- ダブルクォート(上から1番目、左から3番目)
- バックスラッシュ(上6左1)
- シングルクォート:
- シングルクォート(上1左8)
- バックスラッシュ(上6左1)
'\\'でエスケープ(のつもり(謎))
- ダブルクォート:
- ダブルクォート(上1左3)
- ドル記号(上1左5)
- 変数展開と関係する
- 0,1,2,3,4,5,6,7 (上2左5〜12)
- 8進表記とみなされる
- バックスラッシュ(上6左1)
- f (上6左11)
- エスケープシーケンス
- n (上7左7)
- エスケープシーケンス
- r (上7左11)
- エスケープシーケンス
- t (上8左1)
- エスケープシーケンス
- v (上8左3)
- エスケープシーケンス
- シングルクォート:
- シングルクォート(上1左8)
- バックスラッシュ(上6左1)
後ろに英字が続くと‥
- ダブルクォート:
- ダブルクォート(上1左3)
- ドル記号(上1左5)
- 変数とみなされ、展開される(変数の値を定義していないので空文字列)
- シングルクォート:
- シングルクォート(上1左8)