PHP7から予約語がメソッド名として使えるようになっていた件
PHPで”echo”とか”list”という名前のメソッドを作って文法エラーになった経験はないでしょうか?
ほとんど知られていないのですが、実はPHP7からは”echo”,“list”などの予約語がメソッド名として使えるんです。
<?php
class Foo
{
public function list()
{
echo "list\n";
}
public function echo()
{
echo "echo\n";
}
public static function die()
{
echo "die\n";
}
}
$foo = new Foo();
$foo->list();
$foo->echo();
Foo::die();
PHP 5だと文法エラーになっていた
$ php a.php
PHP Parse error: syntax error, unexpected 'list' (T_LIST), expecting identifier (T_STRING) in a.php on line 5
PHP 7だとちゃんと動く
$ php a.php
list
echo
die
MyClass::new()とかできる
面白いことに、newという名前のクラスメソッドを作れたりします。
public static function new()
{
//中身は自由に定義できる
}
おかげでPerlと同じ言語仕様になりましたね!
なぜ使えるのか?
公式マニュアルを見ると、listやechoなどは関数名として使えないと明記されています。
http://php.net/manual/ja/reserved.keywords.php
以下のキーワードはいずれも定数、クラス名、 関数名として使用することはできません。
つまり仕様では使えないはずのものが使えている状態です。
RFCが可決されていた
実はこの新仕様はRFCが提出されており、ステータスが「PHP7.0で実装済み」となっています。
https://wiki.php.net/rfc/context_sensitive_lexer
Pull Reqeustの方を見るとマージ済みになっていてラベルが”PHP7.1”となっています。 https://github.com/php/php-src/pull/1221/
つまりPHP7.1で公式の言語仕様として採用されるものと思われます。
個人的にこの仕様変更はとてもうれしいので大歓迎です。
PHP ++
カテゴリ:
php