ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, namespaceの名前空間に予約語が使える。トークンとして扱うからできるんだって。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHP8からnamespace の名前空間の名前に予約語が使えるようになりました。

(そもそもnamespace名は大文字から始めるのがコーディングのスタンダードなので、予約語とバッティングしにくいと思うが。)

トークンとして扱うようになったからできるらしんですが、そもそもトークンってなんだ?

PHP8とそれ以前の実行結果

まずは、PHP7で次のコードを実行します。

<?php

namespace test\class;

class test{};

echo 'program end' . PHP_EOL;
php74の実行結果
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については。)

php80の実行結果
program end

PHP8で使える理由は、名前空間の各名称をトークンにしたからそう。

ってか、トークンって言われても、って思いませんか?

トークンはプログラムにおける最小単位

トークンは、『プログラムの意味のある文字列の最小単位』のことです。

プログラムは実行する際に構文解析(コードの文法チェック)を行うんですが、その前にプログラムコードの文字列を分割します。

その分割単位がトークン。

トークンは『字句』と訳され、意味のある最小単位に区切る作業を字句解析といいます。

プログラムの実行では、コードをぜんぶまとめてどーんとCPUに送るのではなく、トークンを順に送り出します。

ベルトコンベアーでダンボール箱を送るイメージでしょうか?

PHP8と7以前のトークンによるちがい

PHP7までは、なにかのトークンの箱(おそらくnamespaceの文字列全体)に 'class' が入ってたら、classキーワードなのかただの文字列('class')なのか分からんから使うなよ、というエラーが出ました。

トークンの意味の逆から見れば、namespace内の 'class' 文字列は、単独ではプログラムの意味のない文字列です。

もちろん、namespace名としては意味がある。もしエラーにならないのなら。

そこでトークンじゃないのに意味があったら classキーワードとの区別が難しいということ。

PHP8ではこれが、トークンによって明確に区別されます。クラスの箱とnamespace名の箱で区別されるから大丈夫だよ、になりました。

前の投稿
PHP8, 例外キャッチで変数がなくてもいい - 文法(シンタックス)の変更
PHP8, 『Throwは式になりました』ってどういうこと? 見た目から式だと思ってた。
次の投稿
コメントを残す

*