【PHP】isset、empty、is_nullの効率的な使い方(PHP高速化)

Webサイト制作
Web開発
2019.07.31

 

WEBシステムを作成する場合PHPで開発される方も多いと思います。
その中で、変数の値をチェックする関数は無数に有ると思います。
isset、empty、is_nullもその中の関数です。
これらの関数は、それぞれチェックする項目がすこしずつ異なるのですが
その違い、またシステムの速度に与える影響とその理由を説明したいと思います。

isset、empty、is_nullのチェックする項目の違い

isset、empty、is_nullは渡された値によってture若しくはfalseを返します。
判定したい情報によって関数を使い分けるというのが一般的です。
主にissetはその変数が存在するかを判定します。
emptyはその変数の中身が空かどうかを判定します。
is_nullはその変数の中身がNULLかどうかを判定します。

isset empty is_null
“” true true false
0 true true false
NULL false true true
array() true ture false

チェックする項目は違いますが、チェックする値を何にするかという段階でどの関数を使用するか決めておくことで
ほとんどの場合どの関数でもシステムを組むことは可能になると思われます。

それぞれの関数の実行速度

先程あげた3つの関数を1000万回動作させた場合どの程度処理時間が異なるのかを検証してみました。
検証用のプログラムはこちらになります。

<?php
$check_data = null;
// issetの処理
$start_time = microtime(true);
for ($i=0; $i<=100000000;$i++) {
    if (isset($check_data2)) {

    }
}
$end_time = microtime(true);
echo 'isset処理時間:'.($end_time - $start_time)."秒\n";
// emptyの処理
$start_time = microtime(true);
for ($i=0; $i<=100000000;$i++) {
    if (empty($check_data)) {

    }
}
$end_time = microtime(true);
echo 'empty処理時間:'.($end_time - $start_time)."秒\n";
// is_nullの処理
$start_time = microtime(true);
for ($i=0; $i<=100000000;$i++) {
    if (is_null($check_data)) {

    }
}
$end_time = microtime(true);
echo 'is_null処理時間:'.($end_time - $start_time)."秒\n";

出力結果は以下のようになりました。
これは10回ほど動作させましたが似たような数値となりました。

isset処理時間:3.7318530082703秒
empty処理時間:4.00919008255秒
is_null処理時間:10.605492830276秒

この結果から一番はやい関数はissetになり次にemptyそして2倍以上の時間をかけてis_nullが実行されていたことが分かりました。

速度差の出たのは何故か

では、それぞれの関数の処理時間に差が出たのはなぜでしょうか?
それはissetとemptyは正確にいうと関数ではなく、この3つの中で関数なのはis_nullだけだからです。
ではissetとemptyは一体何なのでしょうか?
この2つは関数ではなくPHPの言語自体に組み込まれた言語構造になります。

言語構造とは

言語構造とはPHPの言語自体を動作させる記述に組み込まれた機能になります。
echo等も言語構造に含まれ
echoの記述が

  • echo “文字列”;
  • echo “文字列1”, “文字列2”;
  • echo(“文字列”);

の様に様々な記述の仕方が許されているのも関数では無いからになります。

PHPの言語構造に記載されているものは

  • array()
  • as
  • break
  • case
  • catch
  • continue
  • default
  • die()
  • echo
  • else
  • elseif
  • empty()
  • eval()
  • exit()
  • for
  • foreach
  • isset()
  • list()
  • print
  • return
  • switch
  • while

一部抜粋(参考:PHP のキーワード

上記の様にPHPのコーディングでよく使われるものが言語構造に組み込まれています。
このPHPのキーワードに記載されて居ないものが関数として定義されているものとなります。

言語構造が関数より早い理由

では何故言語構造だと関数より早いのか
それは言語構造は言語に最初から存在するものとしてハードコーディングされている為
関数よりも先に確認に行く為です。
つまり、同じ動作とさせる際に関数の機能よりも言語構造の機能を採用できるように
コーディングをする事で、何も考えずに作ったシステムよりもより高速化ができるという事になります。

まとめ

PHPでシステムを構築する場合、基本的にはDBとのデータのやり取りが
速度のネックになりやすいですが、DB周りのチューニングをしっかりと行っていくと
コード内の細かな記述方法により少しずつですがシステムの速度に差が出てきます。
この微々たる差でも、多量のアクセスが有るシステム等では、1アクセスに付き同じだけ速度の差が出て来るため
システムの処理能力に大きな影響を及ぼすかもしれません。
ワンランク上のPHP技術者になるためには言語構造を意識してコーディングをしていくと良いかもしれません。

SEOやWEB制作に関する情報を検索する

コラム

最新コラム

人気コラム

過去の記事

ご質問やご相談などお気軽にお問い合わせください。