あなたは知っていますか?PHPの予約語を徹底解説!


PHPの予約語ってどんなものがあるのかな?
どんなことに気を付けて、予約語を取り扱ったらいいんだろう?

こんにちは。HTMLやPHPの開発歴8年の著者が、PHPの予約語についてご紹介します。

PHPでプログラミングする際に、予約語というものを意識したことはありますか?おそらく、意識していなくてもたくさんの予約語を使っているはずです。

今回は、そのように無意識にたくさん使われている予約語について、その特徴などについて詳しく解説しようと思います。

目次

PHPにおける予約語とは

PHPにおける予約語とは、簡単に言うと、すでにPHP側で用意されている言葉のことです。そして、この予約語の扱いを間違ってしまうと、状況によってはプログラムエラーでシステムが落ちてしまったりします。

ですので、予約語を知って適切に扱うことは、実は非常に大切なことなのです。

予約語の特徴

予約語とはどのような特徴があるのでしょうか。まず、PHPにおける予約語については、次の種類があります。

  • キーワード
  • 定義済のクラス
  • 定義済みの定数
  • その他の予約語
  •  
    キーワードとして登録されている予約語を使って、好き勝手に関数名やクラス名は作れません。また、定義済みのクラス名や定数名なども同様に、これと同じクラス名や定数名を定義することができません。

    このような形で、PHPにはあらかじめ予約語が設定されています。詳しくは、後ほど解説します。

    予約語を使ってしまった時の挙動

    では、予約語を誤って使ってしまった場合、どのようになるのでしょうか?例を示します。

    例えば、このようなコードを記述したとします。

    <?php
    function echo(){
       echo "aaa";
    }
    ?>

    すると、echoは予約語として登録されていますので、このプログラムを実行すると次のようにエラーメッセージが表示されます。


    echoを関数名にしたことによるエラー

    基本的に、PHPでは予約語を禁止された方法で使用してしまうと、このようにエラーメッセージが表示されます。予約語を気にせずに使っていて、意図せずシステムエラーとなってしまうのはちょっと危険ですね。

    なので、予約語についてはある程度知っておく方が良いでしょう。

    予約語の一覧

    ではPHPの予約語にはどのようなものがあるのか、全て確認してみましょう!なお、PHPのバージョンは7を想定しています。

    キーワードのリスト

    PHPの予約語のうち、キーワードとして登録されているものは次の通りです。

    __halt_compilerabstractandarrayas
    breakcallablecasecatchclass
    cloneconstcontinuedeclaredefault
    diedoechoelseelseif
    emptyenddeclareendforendforeachendif
    endswitchendwhileevalexitextends
    finalfinallyforforeachfunction
    globalgotoifimplementsinclude
    include_onceinstanceofinsteadofinterfaceisset
    listnamespaceneworprint
    privateprotectedpublicrequirerequire_once
    returnstaticswitchthrowtrait
    tryunsetusevarwhile
    xoryieldyield from__CLASS____DIR__
    __FILE____FUNCTION____LINE____METHOD____NAMESPACE__
    __TRAIT__

    バージョンの違いについては後述しますが、PHP7.0.0より前では、これらのキーワードは定数、クラス名、関数名として使用することはできません。また、変数名としては使用可能ですが、コードの可読性の低下や意図せぬミスを誘発してしまう恐れがあるため、おすすめはできません。

    PHP 7.0.0 以降は、これらのキーワードはプロパティや定数名として使えるようになりました。また、クラス・インターフェイス・トレイトのメソッド名としても使えます。

    しかし、”class”だけは定数名として使うことはできません。何はともあれ、これらを本来の使い方以外で使うには注意が必要です。

    定義済のクラス

    PHPの予約語のうち、定義済のクラスとして登録されているものは次の通りです。

    DirectorystdClass__PHP_Incomplete_Classself
    staticparentExceptionErrorException
    php_user_filterClosureGeneratorArithmeticError
    AssertionErrorDivisionByZeroErrorErrorThrowable
    ParseErrorTypeError

    これらはすでにPHPで定義されているクラスですので、同じ名前でクラスを作成することはできません。こちらも取り扱い注意となります。

    定義済みの定数

    PHPの予約語のうち、定義済みの定数として登録されているものは次の通りです。

    PHP_VERSIONPHP_MAJOR_VERSIONPHP_MINOR_VERSION
    PHP_RELEASE_VERSIONPHP_VERSION_IDPHP_EXTRA_VERSION
    PHP_ZTSPHP_DEBUGPHP_MAXPATHLEN
    PHP_OSPHP_OS_FAMILYPHP_SAPI
    PHP_EOLPHP_INT_MAXPHP_INT_MIN
    PHP_INT_SIZEPHP_FLOAT_DIGPHP_FLOAT_EPSILON
    PHP_FLOAT_MINPHP_FLOAT_MAXDEFAULT_INCLUDE_PATH
    PEAR_INSTALL_DIRPEAR_EXTENSION_DIRPHP_EXTENSION_DIR
    PHP_PREFIXPHP_BINDIRPHP_BINARY
    PHP_MANDIRPHP_LIBDIRPHP_DATADIR
    PHP_SYSCONFDIRPHP_LOCALSTATEDIRPHP_CONFIG_FILE_PATH
    PHP_CONFIG_FILE_SCAN_DIRPHP_SHLIB_SUFFIXPHP_FD_SETSIZE
    E_ERRORE_WARNINGE_PARSE
    E_NOTICEE_CORE_ERRORE_CORE_WARNING
    E_COMPILE_ERRORE_COMPILE_WARNINGE_USER_ERROR
    E_USER_WARNINGE_USER_NOTICEE_DEPRECATED
    E_USER_DEPRECATEDE_ALLE_STRICT
    __COMPILER_HALT_OFFSET__TRUEFALSE
    NULL

    これらはすでにPHPのコアで定義されている定数ですので、defineを使ってこれらと同じ定数名の定義はできません。クラス内のconstで定義される定数名としては使うことができます。

    その他の予約語の一覧

    PHPにおけるその他の予約語は次の通りです。

    intfloatboolstring
    truefalsenullvoid
    iterableobject

    これらは、クラス・インターフェイス・トレイトの名前として使えません。また、名前空間の中であったとしても使用不可です。

    PHPのバージョンによる違いについて

    PHP5とPHP7では、同じ予約語でもバージョンによって挙動が違います。PHP5ではできなかった予約語の使い方が、PHP7ではできるようになっている部分があります。

    この章では予約語のPHPバージョンによる違いについて説明したいと思います。

    PHP5の場合

    PHP5の場合、例えばこのようなコードを記述すると、エラーとなります。

    <?php
        class TestClass{
            function echo(){
                echo "OK!";
            }
        }
        $test_class = new TestClass;
        $test_class->echo();
    ?>


    PHP5の場合はエラーとなる

    PHP5では、クラス内のメソッド名としてechoは使えないと言うことですね。

    PHP7の場合

    ではPHP7ではどうでしょうか?同じコードを実行してみます。

    <?php
        class TestClass{
            function echo(){
                echo "OK!";
            }
        }
        $test_class = new TestClass;
        $test_class->echo();
    ?>


    PHP7の場合は問題なく使える

    このように、PHP7では問題なく使えました。バージョンの違いによってエラーになったりならなかったりします。

    しかし、PHP7ではエラーにならないと言っても、無闇に予約語を使いすぎると本来の意味での予約語の使い方と混乱してきて開発に支障をきたすことも考えられます。ですので、もし予約語をあえて使用する場合にはやはり注意が必要でしょう。

    まとめ

    以上がPHPにおける予約語についての解説でした。予約語を誤って使ってしまうと、エラーになってしまいましたね。

    しかし、エラーになる状況はPHPのバージョンにもよるので、注意が必要です。PHP7の方が予約語を使う際の制限が少なくなっていました。

    予約語の特徴を掴んで、効果的に関数名などを作成することができると、開発効率やコーディングの美しさにも繋がると思いますので、ぜひ一度、予約語について学んでみてください!

    この記事を書いた人

    プログラム歴10年のシステムエンジニアです。
    経験のある言語はHTML,JavaScript,PHP,VB,VBAなど。
    WEB系の開発が得意です。

    目次