PHP PHP入門講座 プログラミング

【PHPプログラミング入門講座】特殊なメッセージ(文字列)の書き方

PHPプログラミングのキービジュアル

実はダブルクォーテーションも使えます

これまでの記事で、「メッセージ(文字列)はシングルクォーテーション( ' )で囲む」と説明しましたが、正確には、文字列は「シングルクォーテーション( ' )」または「ダブルクォーテーション( " )」で囲むことができます。
具体的には次のように2通りの書き方ができます。

echo 'これはペンです。';
echo "これはペンです。";

これらの内容は、いずれも次のように同じ結果を表示します。

これはペンです。

ただし、これはシンプルな文字列の場合です。
厳密には、シングルクォーテーションで囲んだ場合と、ダブルクォーテーションで囲んだ場合とでは、次のような違いがあります。

  • 改行やタブなど特殊な記述の出力が異なる。
    シングルクォーテーションの場合は改行やタブの記述を解釈せずにそのまま出力する。
    ダブルクォーテーションの場合は改行やタブなどの記述を解釈して出力する。
    (具体的な内容は後述します)
  • シングルクォーテーションの方が、ダブルクォーテーションよりも処理が速い。
    シングルクォーテーショで文字列を囲んだ方が、特殊な記述を解釈する処理がなく、即時にそのまま文字列を出力するため、ダブルクォーテーションで囲むよりも処理が速いです。
    ナノ秒レベルの差だと思いますが、塵も積もれば山となるであり、処理が多くなったり、Webサイトへの同時アクセス数が多くなったりなどで、やや影響が出るかもしれません。
    なので、特に理由がなければ、できるだけシングルクォーテーションを使うのがオススメです。

改行

ここでいう改行ですが、HTMLの改行<br>ではなく、HTMLソースに出力する文字列自身の改行のことです。
Webページを開発する際にあまり意識する必要は無いかもしれませんが、もしかしたら、HTMLソースを改行して読みやすくしたいという場合など、いざというときに必要になるかもしれませんので、覚えておきましょう。

ということで、難しく言いましたが、実は改行をするのは簡単です。
例えば「これはペンです。」の「これは」の次に改行を入たい場合、次のように書けばOKです。

echo 'これは
ペンです。';
echo "これは
ペンです。";

そのままですね(笑)

でも、HTMLタグの「<」と「>」が別の行に記述してたら気持ち悪いと思うのと同様に、シングルクォーテーション / ダブルクォーテーションの開始と終了が違う行にあると、プログラムソースの可読性(読みやすさ)が低下します。
プログラムソースもオシャレにカッコよく書きたいものです。

そこで、PHPには、改行を記述するために「\n」(※注1)という特別な記述法があります。

ちなみに、「\」のことを「バックスラッシュ」と呼びます。
「/」(スラッシュ)の逆向きだから、バックスラッシュということですね。

  • Windowsの場合
    \」(バックスラッシュ)が入力できないため、「\n」(バックスラッシュ + n)の代わりに「¥n」(円マーク + n)と入力してください。
    これは日本のコンピューターの歴史的な背景で、日本語のフォントを使っている場合に「\」(バックスラッシュ)を入力すると「¥」(円マーク)が表示される仕様によるものです。
    画面で「¥n」(円マーク + n)と表示されていても、「\n」(バックスラッシュ + n)と記述した場合と同じ処理が行われます。
  • Macの場合
    「¥n」(円マーク + n)ではなく「\n」(バックスラッシュ + n)と正しく入力しなければ正常動作しません。
    「option」ボタンを押しながら「¥」(円マーク)ボタンを押すと、「\」(バックスラッシュ)を入力することができます。

さて、改行の記述方法について説明しました。
実際に記述してみましょう。

echo 'これは\nペンです。';
echo "これは\nペンです。";

そして、ブラウザで動作確認してみましょう。
動作確認方法ですが、ブラウザ画面ではなく、ブラウザ画面のHTMLソースを確認してください(HTMLの改行<br>ではなく、HTMLソース自身の改行です)。
それぞれの結果は、次のようになっているはずです。

<シングルクォーテーションで囲んだ場合>

これは\nペンです。

<ダブルクォーテーションで囲んだ場合>

これは
ペンです。

あれ?結果が異なりますね。原因わかりますか?

答えは前述しましたが、
シングルクォーテーションは改行やタブの記述を解釈せずにそのまま出力する。ダブルクォーテーションは改行やタブなどの記述を解釈して出力する。
という違いがあるためです。

つまり、
「\n」を使用して改行する場合、対象となる「\n」を含んだ文字列は、ダブルクォーテーションで囲まなければならない。
ということです。

以上で、改行の記述方法の説明は終わりです。

(※注1:厳密には、Linux系では「\n」、WIndows系では「\r\n」になりますが、いずれも「\n」で改行されるので、厳密性を求められない限りは「\n」で大丈夫です。また別の機会に説明しようと思います。)

タブ

もし、HTMLソースにタブを出力したい場合は「\t」を使用します。
こちらも、「\n」と同様に、

echo '\tタブがあります。';
echo "\tタブがあります。";

と書くと、シングルクォーテーションの場合は、

\tタブがあります。

とそのまま「\t」が出力され、
ダブルクォーテーションの場合は、

[TAB]タブがあります。

と出力されます。
([TAB]の部分はタブが出力されています(タブを表現するために、本当のタブの代わりに、文字で[TAB]と書いています)

\マーク

「\n」や「\t」のような記述に「\」を使いましたが、では「\」自身は出力できるのかという疑問があるかもしれません。
その場合は、次のように書きます。
シングルクォーテーションの場合は、そのまま出力されるので、

echo '\はバックスラッシュと呼びます。';

ダブルクォーテーションの場合は、「\」を二重にして「\\」と書けばOKです。

echo "\\はバックスラッシュと呼びます。";

以上のシングルクォーテーションを使用した書き方、ダブルクォーテーションを使用した書き方は、いずれも次のように出力されます。

\はバックスラッシュと呼びます。

シングルクォーテーション/ダブルクォーテーションを出力する方法

メッセージ(文字列)を囲んでいるシングルクォーテーション「'」やダブルクォーテーション「"」を文字列として出力したい場合、どうすれば良いかについて考えてみましょう。
例えば、次のように記述すると、メッセージ(文字列)の範囲(開始と終了)が判断できないため、動作確認するとエラーになります。

echo 'That's right!';
echo "He said, "This is a pen."";

さて、どうしたら良いでしょう?

ピンときた人は、次のように書くことを思いつくかもしれません。

echo "That's right!";
echo 'He said, "This is a pen."';

文字列にシングルクォーテーションが含まれていればダブルクォーテーションで囲み、ダブルクォーテーションが含まれていればシングルクォーテションで囲むという作戦です。

はい、正解です!
かしこさを1ポイント差し上げます(笑)

実行結果は次のとおりです。期待通りの結果になりました。

That's right!

He said, "This is a pen."

ただ他の方法もあります。
「\」を使って次のように書くことができます。覚えておきましょう。

echo 'That\'s right!';
echo "He said, \"This is a pen.\"";

文字列中のシングルクォーテーションや、ダブルクォーテーションは直前に「\」をつけることで、文字列の両端を囲む記号ではなく、文字列として出力する記号であると、PHPの実行エンジンに知らせることができます。

実行結果は次のとおりです。この書き方も期待通りの結果になりました。

That's right!

He said, "This is a pen."

このシングルクォーテーション / ダブルクォーテーションの書き方は、どちらも正解です。
使用する場面で、書きやすい方、プログラムソースが読みやすい(可読性が高い)方を選ぶと良いと思います。

エスケープ記号について

さて、これまで「\n」、「\t」、「\\」、「\'」、「\"」のような特殊な文字列の記述方法について説明してきました。
全ての共通点は「\」がついているという点です。
この場合に使用する「\」は、特別な記述の場合にエラーを回避する(エスケープする)という意味で、「エスケープ記号」と呼びます。
開発現場で、しばしば使用する言葉ですので、覚えておきましょう。

おわりに

今日は文字列の特別な記述方法について説明しました。
いかがでしょうか?
慣れれば簡単になります。
何度もこの記事を読み直して頑張って理解してみてください。

PHPプログラミング入門講座 〜 全記事一覧 〜

-PHP, PHP入門講座, プログラミング
-, , , ,

Copyright© ハッピー・プログラミング・ライフ , 2020 All Rights Reserved.