php / php/php-src

Allow catching as ParseError "Non-abstract method C::foo() must contain a body"

オープン
#9,333 コメント 5 件 リアクション 3 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Feature Status: Needs Triage
主要言語
C
スター
40.4k
フォーク
8.1k
平均マージ
2日 13時間
マージ済み PR(30日)
96

説明

Description

Since PHP 7 it is possible to catch syntax errors in PHP files during inclusion, which is a very nice feature, such as:

try {
  eval("class C { function foo() }");
}
catch (\Throwable $e) {
  print "CAUGHT [" . get_class($e) . "]: " . $e->getMessage() . "\n";
}
// prints: CAUGHT [ParseError]: syntax error, unexpected token "}", expecting ";" or "{"
// execution continues

Unfortunately, the same is not possible in case the error is a non-abstract method without body:

try {
  eval("class C { function foo(); }");
}
catch (\Throwable $e) {
  print "CAUGHT [" . get_class($e) . "]: " . $e->getMessage() . "\n";
}
// prints: Fatal error: Non-abstract method C::foo() must contain body in /in/YY0Wu(13) : eval()'d code on line 1
// execution terminates

Would it be possible to implement a throw also for this case?

https://3v4l.org/YY0Wu

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

PHP インタープリターの eval() パスから始め、示されている構文エラーがどのように ParseError になるかと、非 abstract メソッドのチェックが現在どのように実行を終了させているかを比較します。issue の 2 つの eval() 例を reproducer として使用します。2 つ目のケースを ParseError として捕捉でき、実行が継続すれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
php
領域
compilers
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。