psysh で予約語をメソッド名にできない
◆ 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
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) {
}
<?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) {
}
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}
>>>
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
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 便利だと思ってたのですが 結構だめですね