PHP8からnamespace の名前空間の名前に予約語が使えるようになりました。
(そもそもnamespace名は大文字から始めるのがコーディングのスタンダードなので、予約語とバッティングしにくいと思うが。)
トークンとして扱うようになったからできるらしんですが、そもそもトークンってなんだ?
PHP8とそれ以前の実行結果
まずは、PHP7で次のコードを実行します。
<?php
namespace test\class;
class test{};
echo 'program end' . PHP_EOL;
PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) in /home/vagrant/php-test.php on line 3
'class' はクラスを定義するときに使うキーワードで予約語になってるので、namespaceには使えないというエラー。
関数名やクラス名、メソッド名とかでも出るやつですね?
これが、PHP8では使えます。
(namespaceについては。)
program end
PHP8で使える理由は、名前空間の各名称をトークンにしたからそう。
ってか、トークンって言われても、って思いませんか?
トークンはプログラムにおける最小単位
トークンは、『プログラムの意味のある文字列の最小単位』のことです。
プログラムは実行する際に構文解析(コードの文法チェック)を行うんですが、その前にプログラムコードの文字列を分割します。
その分割単位がトークン。
トークンは『字句』と訳され、意味のある最小単位に区切る作業を字句解析といいます。
プログラムの実行では、コードをぜんぶまとめてどーんとCPUに送るのではなく、トークンを順に送り出します。
ベルトコンベアーでダンボール箱を送るイメージでしょうか?
PHP8と7以前のトークンによるちがい
PHP7までは、なにかのトークンの箱(おそらくnamespaceの文字列全体)に 'class' が入ってたら、classキーワードなのかただの文字列('class')なのか分からんから使うなよ、というエラーが出ました。
トークンの意味の逆から見れば、namespace内の 'class' 文字列は、単独ではプログラムの意味のない文字列です。
もちろん、namespace名としては意味がある。もしエラーにならないのなら。
そこでトークンじゃないのに意味があったら classキーワードとの区別が難しいということ。
PHP8ではこれが、トークンによって明確に区別されます。クラスの箱とnamespace名の箱で区別されるから大丈夫だよ、になりました。
PHP公式ドキュメント