基本
比較演算子
比較演算子はPHPの中でも見過ごされがちなところで、そのせいで予期せぬ結果になってしまうことが多い。
そんな問題の原因のひとつが、緩い比較と厳格な比較の違いだ。
条件式
If 文
‘if/else’文を関数やクラスメソッドの中で使うときにありがちな誤解がある。
そうじゃなかったときにどんな結果になるのかを示すために’else’が必須だと考えることだ。
でも、もしその結果を戻り値に使うのなら’else’は必須じゃない。
だって’return’の時点で関数は終了するんだから、’else’は無意味だ。
Switch 文
Switch文を使えば、ifとelseifを延々と書き連ねる必要がなくなる。
でも、気をつけないといけないこともある。
- Switch文は値を比較するだけで、型は比較しない(つまり、’==’で比較してるってこと)
- マッチする条件が見つかるまで、すべてのcaseを順に評価する。マッチするものがない場合、もしdefaultが定義されていればそれを使う
- ‘break’がなければそのまま次のcaseに進み、breakかreturnに達するまで止まらない
- 関数の中で’return’を使うときは’break’は不要だ。その時点で関数を終了する
グローバル名前空間
名前空間を使っていると、自作の関数に邪魔されて組み込みの関数が実行できなくなることがある。
これを修正するには、組み込み関数を使いたいときには関数名の前にバックスラッシュをつけるようにするといい。
文字列
連結
- 一行がある一定の長さ (目安は120文字) を超える場合は複数行に分けて連結する
- 可読性を考えると、代入演算子でつなげるよりも連結演算子を使ったほうがよい
- 同じ変数のスコープ内ではあるが、連結演算子で次の行に移るときはインデントする
文字列型
文字列型は文字をつなげたものだ。…と、それだけ聞けばきわめてシンプルに感じるはずだ。
でも、文字列にはいくつかの種類があって、それぞれ微妙に構文が違っているし、挙動も違う。
シングルクォート
シングルクォートは、「リテラル文字列」を表すために使うものだ。
リテラル文字列では、特殊文字をパースしたり変数を展開したりはしない。
シングルクォートを使っている場合に、 'some $thing'
のように変数名を埋め込める。
このときの出力は、そのまま some $thing
になる。
ダブルクォートを使った場合は、 $thing
を変数名とみなして評価する。
もし変数が見つからなければ、エラーになる。
ダブルクォート
ダブルクォートは、文字列界におけるスイスアーミーナイフだ。
変数を展開するだけではなく、あらゆる特殊文字もパースしてくれる。
たとえば \n
を改行に変換したり、 \t
をタブに変換したりといったことだ。
ダブルクォートの中には、変数を含めることもできる。
この機能を使おうとしたときに、変数名と他の文字がつながってしまうことがよくある。
その結果、どこまでが変数名でどこからがリテラル文字なのかがわからなくなってしまう。
この問題に対応するためには、変数名を波括弧で囲めばいい。
Nowdoc 構文
NowdocはPHP 5.3で導入された構文で、内部的にはシングルクォートと同じような動きをする。
複数行にまたがる文字列を、連結演算子なしで表すのに適している。
ヒアドキュメント構文
ヒアドキュメントは、内部的にはダブルクォートと同じような動きをする。
複数行にまたがる文字列を、連結演算子なしで表すのに適している。
複数行にまたがる文字列は、こんなふうに複数行にまたがる文を書くことによっても実現できる。
どっちが速い?
シングルクォートで囲んだほうが、ダブルクォートで囲むよりもちょっとだけ速くなるという迷信が、蔓延している。
でもこれは、間違いだ。
単一の文字列を定義するだけで、文字列の連結などの込み入った処理をしないのであれば、
シングルクォートであろうがダブルクォートであろうが、まったく同じことだ。
どちらが速いとか遅いとかいうことはない。
文字列と任意の型の値を連結したり、ダブルクォートで囲んだ文字列に変数を埋め込んだりしたときの結果は、場合によって異なる。
値の数が少ないときには、埋め込みよりも連結のほうが少しだけ速くなるだろう。
値の数が多くなると、逆に変数を埋め込んだほうが少しだけ速くなるだろう。
文字列を使って何をするにせよ、この違いが目に見えてアプリケーションに影響を及ぼすことはない。
そんなことのためにコードを書き換えるのは、まったくのムダ。
それぞれの意味、そして変更することによる影響を本当に理解しているのでない限り、
そんな些細な最適化は避けること。
三項演算子
三項演算子を使えばコードを短くできるが、必要以上に使いすぎていることが多い。
三項演算子をネストさせることもできるけれど、それぞれ別の行にしたほうが読みやすくなる。
読みやすさを無視して、とにかく行数を減らそうとだけ考えてしまうと、こんな羽目になる。
三項演算子で値を ‘return’ するには、書きかたに気をつけないといけない。
注意しておきたいのは、boolean値を返したいというだけなら、別に三項演算子じゃなくてもかまわないってこと。
=== や !==、!=、== など、どの演算子であっても同じことだ。
三項演算子と括弧を活用する
三項演算子を使うときには、括弧を活用すればコードの可読性を挙げられるし、文の中に結合を含めることもできる。
括弧を使っても使わなくても変わらないのは、こんな例だ。
括弧を使えば、文のかたまり全体をチェックするときに、その中に結合を含めることもできる。
次の例は「$a == 3 かつ $b == 4」がtrueで、かつ$c == 5もtrueのときに、trueを返す。
もうひとつ、別の例を示そう。これは「$a != 3 かつ $b != 4」がtrue、あるいは$c == 5がtrueのときに、trueを返す。
PHP 5.3 以降では、三項演算子の第二項を省略できるようになった。
“式1 ?: 式3” みたいに書くと、式1がTRUEの場合は式1を返して、そうじゃない場合は式3を返す。