PHPの予約語ってどんなものがあるのかな?
どんなことに気を付けて、予約語を取り扱ったらいいんだろう?
こんにちは。HTMLやPHPの開発歴8年の著者が、PHPの予約語についてご紹介します。
PHPでプログラミングする際に、予約語というものを意識したことはありますか?おそらく、意識していなくてもたくさんの予約語を使っているはずです。
今回は、そのように無意識にたくさん使われている予約語について、その特徴などについて詳しく解説しようと思います。
PHPにおける予約語とは
PHPにおける予約語とは、簡単に言うと、すでにPHP側で用意されている言葉のことです。そして、この予約語の扱いを間違ってしまうと、状況によってはプログラムエラーでシステムが落ちてしまったりします。
ですので、予約語を知って適切に扱うことは、実は非常に大切なことなのです。
予約語の特徴
予約語とはどのような特徴があるのでしょうか。まず、PHPにおける予約語については、次の種類があります。
キーワードとして登録されている予約語を使って、好き勝手に関数名やクラス名は作れません。また、定義済みのクラス名や定数名なども同様に、これと同じクラス名や定数名を定義することができません。
このような形で、PHPにはあらかじめ予約語が設定されています。詳しくは、後ほど解説します。
予約語を使ってしまった時の挙動
では、予約語を誤って使ってしまった場合、どのようになるのでしょうか?例を示します。
例えば、このようなコードを記述したとします。
<?php function echo(){ echo "aaa"; } ?>
すると、echoは予約語として登録されていますので、このプログラムを実行すると次のようにエラーメッセージが表示されます。
基本的に、PHPでは予約語を禁止された方法で使用してしまうと、このようにエラーメッセージが表示されます。予約語を気にせずに使っていて、意図せずシステムエラーとなってしまうのはちょっと危険ですね。
なので、予約語についてはある程度知っておく方が良いでしょう。
予約語の一覧
ではPHPの予約語にはどのようなものがあるのか、全て確認してみましょう!なお、PHPのバージョンは7を想定しています。
キーワードのリスト
PHPの予約語のうち、キーワードとして登録されているものは次の通りです。
__halt_compiler | abstract | and | array | as |
break | callable | case | catch | class |
clone | const | continue | declare | default |
die | do | echo | else | elseif |
empty | enddeclare | endfor | endforeach | endif |
endswitch | endwhile | eval | exit | extends |
final | finally | for | foreach | function |
global | goto | if | implements | include |
include_once | instanceof | insteadof | interface | isset |
list | namespace | new | or | |
private | protected | public | require | require_once |
return | static | switch | throw | trait |
try | unset | use | var | while |
xor | yield | yield from | __CLASS__ | __DIR__ |
__FILE__ | __FUNCTION__ | __LINE__ | __METHOD__ | __NAMESPACE__ |
__TRAIT__ |
バージョンの違いについては後述しますが、PHP7.0.0より前では、これらのキーワードは定数、クラス名、関数名として使用することはできません。また、変数名としては使用可能ですが、コードの可読性の低下や意図せぬミスを誘発してしまう恐れがあるため、おすすめはできません。
PHP 7.0.0 以降は、これらのキーワードはプロパティや定数名として使えるようになりました。また、クラス・インターフェイス・トレイトのメソッド名としても使えます。
しかし、”class”だけは定数名として使うことはできません。何はともあれ、これらを本来の使い方以外で使うには注意が必要です。
定義済のクラス
PHPの予約語のうち、定義済のクラスとして登録されているものは次の通りです。
Directory | stdClass | __PHP_Incomplete_Class | self |
static | parent | Exception | ErrorException |
php_user_filter | Closure | Generator | ArithmeticError |
AssertionError | DivisionByZeroError | Error | Throwable |
ParseError | TypeError |
これらはすでにPHPで定義されているクラスですので、同じ名前でクラスを作成することはできません。こちらも取り扱い注意となります。
定義済みの定数
PHPの予約語のうち、定義済みの定数として登録されているものは次の通りです。
PHP_VERSION | PHP_MAJOR_VERSION | PHP_MINOR_VERSION | |
PHP_RELEASE_VERSION | PHP_VERSION_ID | PHP_EXTRA_VERSION | |
PHP_ZTS | PHP_DEBUG | PHP_MAXPATHLEN | |
PHP_OS | PHP_OS_FAMILY | PHP_SAPI | |
PHP_EOL | PHP_INT_MAX | PHP_INT_MIN | |
PHP_INT_SIZE | PHP_FLOAT_DIG | PHP_FLOAT_EPSILON | |
PHP_FLOAT_MIN | PHP_FLOAT_MAX | DEFAULT_INCLUDE_PATH | |
PEAR_INSTALL_DIR | PEAR_EXTENSION_DIR | PHP_EXTENSION_DIR | |
PHP_PREFIX | PHP_BINDIR | PHP_BINARY | |
PHP_MANDIR | PHP_LIBDIR | PHP_DATADIR | |
PHP_SYSCONFDIR | PHP_LOCALSTATEDIR | PHP_CONFIG_FILE_PATH | |
PHP_CONFIG_FILE_SCAN_DIR | PHP_SHLIB_SUFFIX | PHP_FD_SETSIZE | |
E_ERROR | E_WARNING | E_PARSE | |
E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | |
E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | |
E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED | |
E_USER_DEPRECATED | E_ALL | E_STRICT | |
__COMPILER_HALT_OFFSET__ | TRUE | FALSE | |
NULL |
これらはすでにPHPのコアで定義されている定数ですので、defineを使ってこれらと同じ定数名の定義はできません。クラス内のconstで定義される定数名としては使うことができます。
その他の予約語の一覧
PHPにおけるその他の予約語は次の通りです。
int | float | bool | string |
true | false | null | void |
iterable | object |
これらは、クラス・インターフェイス・トレイトの名前として使えません。また、名前空間の中であったとしても使用不可です。
PHPのバージョンによる違いについて
PHP5とPHP7では、同じ予約語でもバージョンによって挙動が違います。PHP5ではできなかった予約語の使い方が、PHP7ではできるようになっている部分があります。
この章では予約語のPHPバージョンによる違いについて説明したいと思います。
PHP5の場合
PHP5の場合、例えばこのようなコードを記述すると、エラーとなります。
<?php class TestClass{ function echo(){ echo "OK!"; } } $test_class = new TestClass; $test_class->echo(); ?>
PHP5では、クラス内のメソッド名としてechoは使えないと言うことですね。
PHP7の場合
ではPHP7ではどうでしょうか?同じコードを実行してみます。
<?php class TestClass{ function echo(){ echo "OK!"; } } $test_class = new TestClass; $test_class->echo(); ?>
このように、PHP7では問題なく使えました。バージョンの違いによってエラーになったりならなかったりします。
しかし、PHP7ではエラーにならないと言っても、無闇に予約語を使いすぎると本来の意味での予約語の使い方と混乱してきて開発に支障をきたすことも考えられます。ですので、もし予約語をあえて使用する場合にはやはり注意が必要でしょう。
まとめ
以上がPHPにおける予約語についての解説でした。予約語を誤って使ってしまうと、エラーになってしまいましたね。
しかし、エラーになる状況はPHPのバージョンにもよるので、注意が必要です。PHP7の方が予約語を使う際の制限が少なくなっていました。
予約語の特徴を掴んで、効果的に関数名などを作成することができると、開発効率やコーディングの美しさにも繋がると思いますので、ぜひ一度、予約語について学んでみてください!