文字列の扱いについて
お久しぶりです。井出です。
最近触ることが少なくなったPHPですが
先日改修案件があり前々から気になっていたことを
整理することができたので、今回記事にしました。
それは文字列の扱い方です。
最近rubyを触ることが多いので
PHPとRubyを比較して説明していこうと思います。
その前に「文字列」とは何なのか
からお話しできればと思います。
文字列とは
文字列とは文字の集合体です。
「プラコレ」という文字列を例に挙げて説明します。
プログラム上、「プラコレ」は分解すると
「プ」「ラ」「コ」「レ」
という4つの文字が集合して文字列として成り立っています。
文字列は文字の集合体とはそういうことになります。
では実際にプログラムの話をしていこうと思います。
Rubyにおいて
Rubyは直観的にソースコードを書け、また豊富なライブラリがあるため、
書いてて楽しい言語ですね。
ruby or railsについては色々話したいので、また別の機会に。
さて本題のRubyの文字列の扱い方ですが
単純明快凄い分かりやすい
1 2 3 |
hoge = "pla-cole" p "#{hoge}" #=> "pla-cole" |
#{}
で変数を囲むことで変数内に格納された文字列が展開されます。
1 2 3 4 |
hoge = "pla-cole" hogehoge = "wedding" p "https://#{hoge}.#{hogehoge}" #=> "https://pla-cole.wedding" |
変数と通常の文字列を併用して使うことも可能です。
ただし注意が必要なのが、これは
ダブルコーテーション「"xxxx"」で括った場合です
シングルコーテーション「'xx'」の場合は、変数の値は展開されません。
※後の説明で使用するPHPも同じです。
1 2 |
p 'https://#{hoge}.#{hogehoge}' #=> "https://\#{hoge}.\#{hogehoge}" |
※ #の前に「\」が、入りました。これはエスケープ文字といいます。
エスケープ文字系を説明すると、1記事書けるレベルなので、
今回は省略させていただきます。
PHPにおいて
さて次はPHPです。以前までこよなく愛してた言語です。
(過去形になっているということはそういうことです。Rubyに気持ちは奪われております。)
Rubyと同じように勿論変数値の展開はできます。
1 2 3 |
$hoge = "pla-cole"; echo "{$hoge}"; "pla-cole" |
お気づきの方がいるかもしれませんが、
ruby と PHPで記述方法が大きく異なる点があります。
1 2 |
ruby hoge = "pla-cole" |
1 2 |
php $hoge = "pla-cole"; |
まず1つ目に変数には「$」を付ける。
2つ目に処理の最後に「;」セミコロンを付ける。
※ 正確にはrubyは、セミコロン省略可能。なので付けても良い
これが良くも悪くも、PHPたまに触ると高確率でエラーとなります。
慣れというのは怖いもので、変数につける「$」については
C系だと無かったので、そんなに違和感無かったのですが
セミコロンを付け無いのは慣れてしまったものの、
個人的にはあった方が、やっぱしっくりきますね。。
さて本題に戻りPHPの文字列展開について
さきほどのrubyを例に同じ内容で記載すると
1 2 3 4 |
$hoge = "pla-cole"; $hogehoge = "wedding"; echo "https://$hoge.$hogehoge"; #=> "https://pla-cole.wedding" |
変数名を入れると、そのまま展開してくれます。
凄い便利ですよね。
で、1つ気になったのが
変数名($hoge)の後ろに[.]を付けていますが
この部分に「_」を入れた場合どうなるのか。
1 2 |
echo "https://$hoge_$hogehoge"; PHP Notice: Undefined variable: hoge_ |
エラりました。
変数名に使用可能な文字列を、変数名の後ろに使用した場合
どこまでが展開する変数なのか。
がPHP側で認識できないためエラります。
今回でいうと
$hoge_
という変数の展開をしよう試みます。
$hoge_
という変数は存在しないためエラー
という結果になりました。
上記のパターンを実現したいときは
先に説明した中括弧で括るようしましょう。
1 2 |
echo "https://{$hoge}_$hogehoge"; https://pla-cole_wedding |
リテラル文字列というか
文字列の展開方法みたいな説明になってしまいましたが
色々整理できたので個人的にはよかったです。
次は今回の説明でもでた、エスケープ文字について
お話できればと思います。
ありがとうございました!