目的
- 「オーバーヘットがあるから
is_null()
より言語構造のisset()
かempty()
を使ったほうがいいかもね〜」って教えてもらって「言語構造」がそもそもよく分かっていなかったので調べてみた
言語構造
-
下記のリンク先に記載されているキーワードはすべてPHPの言語構造である。
-
これらは言語を構成するものです
と言われている通り、どうやらこの一覧に記載されているものはPHPの言語を構成するそのものらしい。 -
この一覧の中に
isset
やempty
が含まれており、これらは呼び出し方法こそ関数に似ているけど関数とは全く別物らしい。 -
その証拠に
isset
とempty
の公式マニュアルには注意: これは、関数ではなく 言語構造のため、可変関数 を用いて コールすることはできません。
と記載されている。 -
if
とかclass
とかも言語構造に含まれているらしく、たしかになんの疑問もなくif (式) {式がtrueのときの処理}
みたいに書いてたけどこれはPHPの基礎部分となる言語構造に記載されているから処理分岐をする事ができているっぽい。
じゃあ先輩が言ってた「is_null()
はオーバーヘットがあるから」はどういう意味か?
- そもそも
is_null()
は引数に指定された変数がnullかどうかを調べる関数である。 - この関数はPHP内部で定義されている。
- PHP内部で定義されているということはユーザー定義関数と同じように
function
を用いてis_null()
は定義されているということだ。 - 当該の定義の中では「引数に指定された変数がnullの時trueを、null以外のときはfalseを返す処理」がPHPによって記載されている。
- ここで
is_null()
とisset()
やempty()
で下記のような差が生まれる。-
is_null()
- 定義されている関数を呼び出す。
- 引数を用いて処理を行う。
- 結果を返す。
-
isset()
やempty()
- 言語構造の振る舞いによって処理を行う。
- 結果を返す。
-
- 要は、PHPの根幹部分に組み込まれている言語構造を用いるなら「定義されている関数を呼び出して内部でいくつかの処理をする」時間がかからないよね!ということだ。
- もちろん
is_null()
の「関数呼び出し→引数を用いて処理」の時間は一瞬なので、気にするほど処理に差が出るわけではない。ただ、差があることは事実なので、積極的にその他の言語構造も使って処理速度を意識した実装をしてゆきたいと思った。