文字列型 ー ゼロから始めるPHP入門(PHP7)【Vol.5】
前回学んだデータ型の一つである文字列型を詳しく学んでいきます。
Contents
シングルクォテーションとダブルクォテーションの違い
文字列はシングルクォテーション('
)か、ダブルクォテーション(""
)で囲みます。PHPの場合、シングルクォテーションとダブルクォテーションで違いがあります。
実際にコードを書いてみましょう。
Atomを起動して、新規ファイルを作ります。「PHPの実行」で作った[php-study]フォルダ内に「sample5-1.php」として保存します。「PHPの実行」と同じようにHTMLのコードをAtomで生成させて、body要素内に以下のコードを書きます。Apacheを起動して、ChromeからPHPを実行してください。
※PHPの実行方法の詳しい手順は「PHPの実行」をご覧ください。またこれ以降のコードに関しても任意のファイル名「sample5-2.php」などを作成して、実際に実行しながら読む進めていってください。
<?php $name = ""太郎""; echo ""こんにちは{$name}さん!""; echo 'こんにちは{$name}さん!'; ?>
実行結果:
こんにちは太郎さん!こんにちは{$name}さん!
太郎と言う文字列リテラルを$name
変数に代入しています。echo文で出力しているのですが、ダブルクォテーション内に{変数名}
と書くと、変数が認識され中の値に置き換わって表示されます。
一方、シングルクォテーションの場合、{$name}
がそのまま文字列として出力されます。
変数が中身のデータに置き換わることを変数の展開といいます。ダブルクォテーション内の変数は展開され、シングルクォテーションの変数は変数として認識されません。
もう一つの違いはエスケープシーケンスの展開です。エスケープシーケンスとはタブや改行などの非表示文字を表したい時に使います。
タブ記号を書いて見ましょう。タブはバックスペース+tで表せます。バックスペースはMacの方は、optionキーを押しながら¥マークのボタンです。バックスペースですが、Windowsの方は環境によって、¥マークで表示される場合があります。
<?php
echo ""こんにちは\t!"";
echo 'こんにちは\t!';
?>
実行結果:
こんにちは !こんにちは\t!
実行結果の通り、ダブルクォテーションはエスケープシーケンスを展開し、タブ記号が入ります。シングルクォテーションの場合、エスケープシーケンスは認識されずそのまま\t
が出力されます。
エスケープシケンスについてはhttp://php.net/manual/ja/regexp.reference.escape.phpに詳しくまとまっています。現段位ではさらっと見ておく程度で十分です。
エスケープシーケンス
エスケープシーケンスのもう一つの利用シーンがあります。
「こんにちは””太郎””」と出力したい時はどうすれば良いのでしょうか。例えば、以下のコードはエラーになります。
echo ""こんにちは""太郎"""";
実行結果:
Parse error: syntax error, unexpected '太郎' (T_STRING), expecting ',' or ';' in
「こんにちは」で一旦文字列が終了したものとみなされてしまい文法エラーになります。
2つ解決方法があります。一つは文字列全体をシングルクォテーションで囲んでしまうことです。
echo 'こんにちは""太郎""';
実行結果:
こんにちは""太郎""
もう一つはエスケープシーケンスを使う方法です。
echo ""こんにちは\""太郎\"""";
実行結果:
こんにちは""太郎""
エスケープシーケンスを""
の頭につけることで、ダブルクォテーションが持つ文法上の意味をエスケープしているので、""
がそのまま出力されます。
ヒアドキュメント
複数行の長い文字列を表したい時に便利なのが、ヒアドキュメントです。
ヒアドキュメントを使うと、シングルクォテーションやダブルクォテーションがエスケープシーケンスなしで使えます。変数の展開もされます。
ヒアドキュメント内で改行すると、改行されてコードが出力されます。ただしWebブラウザの見た目では改行は無視されますが、HTMLソースは改行されます。
実際に書いて見ましょう。
<?php $name = ""太郎""; $msg = <<<EOD お世話になっております。 こんにちは{$name}さん。 ""こんにちは"" 'こんばんは' EOD; echo $msg; ?>
出力結果:
お世話になっております。 こんにちは太郎さん。 ""こんにちは"" 'こんばんは'
ChromeでHTMLのソースを見ると、
お世話になっております。 こんにちは太郎さん。 ""こんにちは"" 'こんばんは'
というように改行もされていることがわかります。Webブラウザの場合、改行を無視してしまうので、Webブラウザの見た目上は1行で表示されてしまいます。
$msg = <<<EOD お世話になっております。 こんにちは{$name}さん。 ""こんにちは"" 'こんばんは' EOD;
EOD
は区切り用のラベルで名前は任意ですが、大文字が慣例上使われます。
ヒアドキュメントの最後のEOD
の頭にタブやスペースが入らないように注意してください。
NowDoc
ヒアドキュメントとほぼ同じですが、変数やエスケープシーケンスを展開する点が違います。
<<<'EOD'
というように区切り用の文字列をシングルクォテーションで囲みます。
<?php $name = ""太郎""; $msg = <<<'EOD' お世話になっております。 こんにちは{$name}さん。 ""こんにちは"" 'こんばんは' EOD; echo $msg; ?>
出力結果:
お世話になっております。 こんにちは{$name}さん。 ""こんにちは"" 'こんばんは'
文字列の結合
文字列は結合演算子(.
)でつなぐことができます。
<?php $name = ""太郎""; echo ""こんにちは"" . $name . ""さん!""; ?>
出力結果:
こんにちは太郎さん!
文字列の文字数を取得する
文字列の長さはmb_strlen関数を使います。
<?php $name = ""太郎""; echo mb_strlen($name); ?>
出力結果:
2
mb_substr関数を使った文字の抽出
mb_substr関数を使うと文字列の一部を抽出できます。
<?php $msg = ""こんにちは、こんばんは""; echo mb_substr($msg, 3, 2); echo ""<br>""; echo mb_substr($msg, 0, 5); echo ""<br>""; echo mb_substr($msg, 3, -3); echo ""<br>""; echo mb_substr($msg, -5, 5); ?>
出力結果:
ちは こんにちは ちは、こん こんばんは
mb_substr関数はmb_substr(部分文字列を取り出したい文字列, 取得開始位置, 取り出す最大文字数, 使用する文字エンコーディング)という順番でデータを渡すと処理してくれます。
文字列の開始位置は0から始まります。マイナスの整数の場合は、文字列の後ろから-1から数えます。
使用する文字エンコーディングは今回は省略しています。省略された場合は、内部文字エンコーディングの値が使われます。
内部文字エンコーディングの値は以下のコードで確認できます。
var_dump(mb_internal_encoding());
実行結果:
string(5) ""UTF-8""