◆ psysh で構文確認はしない

予約語をメソッド名にするとエラーが出る

php7 からは予約語をメソッド名に使えるようになったはずです
ですが psysh だとエラーになってしまいます
C:\dev\php>php7 psysh
Psy Shell v0.6.1 ((PHP 7.0.1 - cli) by Justin Hileman
>>> class a{function echo (){}}
PHP Parse error: Syntax error, unexpected T_ECHO, expecting T_STRING on line 1

普通に php を実行していると問題なく使えています
C:\dev\php>php7
<?php
class a{function echo(){}}
var_dump(new a());
^Z
object(a)#1 (0) {
}

Linux で -a の REPL でも試してみます
[user@fedora ~]$ php -a
php > class a{function echo(){}}
php > var_dump(new a());
object(a)#1 (0) {
}

問題無いですね

psysh で使ってるバージョンも書かれている通り 7.0.1 でバージョンが違うことはないはずです

対策

eval で class 定義をしてしまえば対処できます
C:\dev\php>php7 psysh
Psy Shell v0.6.1 (PHP 7.0.1 - cli) by Justin Hileman
>>> eval('class a{function echo(){}}')
=> null
>>> new a()
=> a {#169}
>>>

構文エラーで PHP が終了してしまわないように読み取ったコードを PHP で実行する前に psysh 側で独自に構文解析でもしているんでしょうか
すごいとは思いますが こういうときに困りものです


メソッド名に予約語使えたかなー とサッと確認したくて psysh でやってみて無理なんだ と思ったのにググってみたらできるよって書いてて 「え?」 ってなりました
構文の確認するときは psysh に頼らないほうがよさそうです

追記

他にもこういうパターンもダメでした
>>> class test {
static $i = null;
static function getUniqInstance(){
return test::$i ?? (test::$i = new test());
}
}
PHP Fatal error: Class 'test' not found in eval()'d code on line 4

test:: や new test で使っている test が未定義なことが原因です
実行するのは後なのになぜかこのタイミングで定義されてるかチェックしています


test と直接書かずに self を使えば 動くようにできますけど psysh 便利だと思ってたのですが 結構だめですね