DESIGNMAP

  1. TOP
  2. プログラミング講座
  3. PHP
  4. 文字列型 ー ゼロから始めるPHP入門(PHP7)【Vol.5】

文字列型 ー ゼロから始めるPHP入門(PHP7)【Vol.5】

前回学んだデータ型の一つである文字列型を詳しく学んでいきます。

シングルクォテーションとダブルクォテーションの違い

文字列はシングルクォテーション(')か、ダブルクォテーション("")で囲みます。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""

スポンサーリンク

プロフィール

DESIGNMAP
お問い合わせ