🍴 🍝 🍴

The Spaghetti Dream

対応機能とその制限一覧

← コンバーターへ戻る

ステータス凡例

📋 このドキュメントについて

このページは、The Spaghetti Dream が 入力コードとして受け付ける PHP 機能の現在の対応状況を説明しています。

対応している機能は SPAGHETTI_SPEC.md で定義された goto ベースのコードに変換されます。 例えば ???: 演算子は入力として対応していますが、出力では goto 文に変換されます。

生成コードに対しては専用の PHPStan ルールセットが用意されており、禁止された構文(構造的制御フロー・OOP 等)が使われていないかを静的解析で検証できます。 → phpstan-spaghetti: Rules 一覧

🏛 オブジェクト指向プログラミング
SUPPORTED オブジェクトのインスタンス化
new ClassName() によるオブジェクト生成が動作します。各インスタンスは独立したIDを保持します。 動的インスタンス化(new $variable())も対応しており、spaghetti 変換済みクラスの場合は配列として生成され、組み込みクラスの場合は __builtin_new() が呼び出されます。
SUPPORTED 匿名クラス
new class { ... } 構文が対応しています。プロパティのデフォルト値やメソッド呼び出しが動作します。 1ファイル内に複数の匿名クラスも対応しています。
SUPPORTED コンストラクタ(__construct
オブジェクト生成後に自動的に呼び出されます。引数も正しく渡されます。
NOT SUPPORTED デストラクタ(__destruct
対応しません。デストラクタは PHP のガベージコレクタによって呼び出されますが、この動作はオペコードストリームに現れないため、変換が不可能です。
回避策: オブジェクトのスコープを外れる前に明示的にクリーンアップメソッドを呼び出してください。
SUPPORTED プロパティ
プロパティの読み書きが動作します。デフォルト値も完全に対応しています。
制限: private/protected の可視性は強制されません。readonlyfinal 修飾子は未対応です。
SUPPORTED PHP 8.4 プロパティフック(get =>
PHP 8.4 の get => 短縮フック構文(計算プロパティ)に対応しています。phpdbg はフックを別メソッドとして出力しないため、PhpParser で AST を解析し、FETCH_OBJ_R の呼び出し箇所にインライン展開します。
  • get => 短縮フック(式で定義された読み取り専用計算プロパティ)
  • 算術・比較演算子を含む式
  • 連鎖インライン展開(フックが別のフック付きプロパティを参照する場合も対応)
非対応:set => フック、ブロック形式のフック(get { return ...; }
SUPPORTED 複合プロパティ代入・前置インクリメント
$obj->prop += 5$obj->prop .= 'x'++$obj->prop などが動作します。
SUPPORTED メソッド・メソッド呼び出し・$this
インスタンスメソッドの定義と呼び出しが動作します。$this も正しく参照できます。
SUPPORTED オブジェクト同一性(===
同一インスタンスかどうかの比較が正しく動作します。
PARTIAL オブジェクト等値比較(==
== 演算子は内部的に配列比較になるため、__id フィールドの差異により本来 true になるべきケースで false が返ることがあります。
回避策: 個々のプロパティを明示的に比較してください。
NOT SUPPORTED private/protected 可視性
可視性修飾子は無視されます。すべてのプロパティとメソッドは実質的に public として扱われます。
SUPPORTED 静的プロパティ・静的メソッド
static プロパティとメソッドが動作します。静的プロパティはグローバルな $_static 配列に格納されます。
SUPPORTED get_called_class()
メソッド内で実際のクラス名(遅延静的束縛)を返します。グローバルスコープでは false を返します(PHP の動作に一致)。
SUPPORTED class_exists() / method_exists()
spaghetti 変換済みのクラスに対して動作します。プロローグで生成される $_spaghetti_classes テーブルを使ってルックアップします。
制限: PHP 組み込みクラス(DateTimeException など)は認識されず、false が返ります。
SUPPORTED クラス定数
ClassName::CONSTANT が動作します。parent::CONSTstatic::CONST、動的クラス参照も対応しています。
SUPPORTED 継承
ユーザー定義クラスの継承が完全に対応しています。コンストラクタ継承、メソッド継承、parent:: 呼び出し、プロパティデフォルト値の継承が動作します。
制限: abstractfinal 修飾子は実行時に強制されません。
SUPPORTED トレイト
use 文によるトレイトの利用、メソッドの継承と解決が動作します。複数トレイトの合成も対応しています。
制限: トレイト競合解決(insteadofas)は未テスト・未対応です。
SUPPORTED インターフェース(instanceof チェックのみ)
implements による実装追跡と instanceof チェックが動作します。
制限: インターフェースメソッドの強制・インターフェース定数・インターフェース継承は未対応です。
PARTIAL マジックメソッド(__construct 以外)
__invoke: SUPPORTED$obj($args) 構文による呼び出しが動作します。
__toString: SUPPORTEDecho、文字列連結などの文字列コンテキストで自動的に呼び出されます。
その他__get__set__call など): NOT SUPPORTED
SUPPORTED clone
clone $obj が完全に対応しています。ユーザー定義オブジェクトは配列がコピーされ新しい __id が付与されます。組み込みオブジェクトは __builtin_clone() で処理されます。
⚙️ 組み込みクラス(PHP ネイティブクラス)
SUPPORTED 組み込みクラスのインスタンス化とメソッド呼び出し
DateTimeDateTimeImmutablestdClassArrayObject などのネイティブ PHP クラスのインスタンス化とメソッド呼び出しが動作します。内部的には FFI ID によって管理されます。
PARTIAL 組み込みクラスのプロパティ
動的プロパティをサポートするクラス(例: stdClass)では動作します。
制限: 一部の組み込みクラスの readonly・protected プロパティは正しく動作しない場合があります。
SUPPORTED 組み込みクラスの静的メソッド
DateTime::createFromFormat() などの静的メソッド呼び出しが動作します。
SUPPORTED 組み込みクラス定数
PHP コンパイラがコンパイル時にリテラル値に解決するため、特別な処理は不要です。
SUPPORTED オブジェクトを返す組み込み関数
date_create() などの返り値が自動的に FFI ID でラップされます。
SUPPORTED オブジェクトを受け取る組み込み関数
date_format()date_diff() などの引数として渡す際に FFI ID が自動的にアンラップされます。
SUPPORTED 組み込みクラスの継承
ExceptionDateTimeArrayObject など任意の組み込みクラスを継承することができます。継承したクラスは __builtin_define_class() を通じて実行時に eval() で定義されます。
SUPPORTED メソッド呼び出しのランタイムディスパッチ
オブジェクトの型を静的に解析できない場合(クラスプロパティに格納されたオブジェクト、メソッドの戻り値など)、_ffi_is_ffi_id() を使ったランタイムディスパッチが自動的に生成されます。
🔧 関数
SUPPORTED ユーザー定義関数・関数呼び出し
ユーザー定義関数の宣言と呼び出しが動作します。引数・戻り値・デフォルト引数・再帰も正しく処理されます。参照渡し(&$param)も対応しています。
SUPPORTED Enum(列挙型)
Pure Enum・Backed Enum の両方をサポートします。各ケースはファイル先頭で $_objects にオブジェクトとして事前割り当てされ、$_class_const['EnumName']['CaseName'] でそのIDを参照します。
  • Pure Enum: enum Status { case Active; }
  • Backed Enum: enum Suit: string { case Hearts = 'H'; }
  • ->name(ケース名)、->value(Backed Enum のバッキング値)
  • === / !== による同一性比較
  • EnumName::CaseName によるケースアクセス
  • EnumName::cases()(宣言順に全ケースの配列を返す)
  • ::from($value)(バッキング値でケース取得。未一致は trigger_error
  • ::tryFrom($value)(バッキング値でケース取得。未一致は null
  • 独自メソッド定義(match($this) パターンを含む)
  • インターフェース実装(implementsinstanceof チェック対応)
  • match 式との組み合わせ
注意:::from() の未一致エラーは \ValueError としてキャッチ不可(trigger_error による致命的エラー)
PARTIAL ジェネレータ(yield
ステートマシン変換により yield をサポートします。各 yield 地点でローカル変数をスナップショット保存し、goto で再開するアプローチです。ジェネレータメソッド(インスタンスメソッド内の yield)も対応し、$this の保存・復元も行います。
  • yield $value / yield $key => $value(明示的なキーも対応)
  • $gen->current() / $gen->next() / $gen->valid()
  • $gen->send($value)(ジェネレータへの値送信)
  • foreach ($gen as $key => $value)(foreach によるイテレーション)
  • 同一関数・メソッドから複数の独立したジェネレータインスタンスを生成可能
  • ジェネレータメソッド($obj->gen()foreach ($obj->gen() as $v)
非対応:yield from(変換時に ConversionException)
SUPPORTED 無名関数・クロージャ・アロー関数
クロージャ(function($x) use ($y) {...})とアロー関数(fn($x) => ...)が完全に対応しています。値キャプチャ・参照キャプチャ・$this バインディングも動作します。
SUPPORTED call_user_func / call_user_func_array
クロージャ変数、文字列の関数名、[$obj, 'method'] 形式のオブジェクトメソッド配列が対応しています。
制限: 'Class::method' 形式の静的メソッド文字列は対応していません。
SUPPORTED 可変長引数(...$args
...$args 形式の可変長引数が完全に対応しています。スプレッド演算子(呼び出し側での ...$array)も動作します。
SUPPORTED 名前付き引数
ユーザー定義関数・メソッドに対して名前付き引数(順序不同・位置引数との混在)が動作します。
📂 ファイルインクルード
SUPPORTED include / require / include_once / require_once(静的パスのみ)
定数文字列パスのインクルードは変換時に解決されてインライン展開されます。再帰的インクルードや _once 系の重複排除も対応しています。
制限: 動的パス(include $file)は対応していません。式としての戻り値($x = include 'file.php')も対応していません。
🔀 制御フロー
SUPPORTED if 文(goto に変換)
SPAGHETTI_SPEC.md の制約に従い、単項条件 + then 節での goto のみが許可されます。すべての構造的条件分岐は goto ベースのパターンに変換されます。
NOT SUPPORTED else / elseiffor / while / foreach ループ
入力コードでは使用できますが、出力コードにはこれらの構造は現れません。すべて goto ベースのパターンに変換されます。
SUPPORTED goto とラベル
生成コードのコア機能です。すべての制御フローは goto ベースのパターンで表現されます。
SUPPORTED match
整数キーおよび文字列キーの match 式が完全に対応しています。各アームは厳密等価チェックと条件付き goto に変換されます。
// 入力
$result = match($n) {
    1 => 'one',
    2, 3 => 'two or three',
    default => 'other',
};

// 生成コード
$_cond = ($n === 1);
if ($_cond) goto main_0003;
$_cond = ($n === 2);
if ($_cond) goto main_0005;
$_cond = ($n === 3);
if ($_cond) goto main_0005;
goto main_0007;  // default
注意: match(true) に複雑な条件(例: $x < 5)を使う場合は MATCH オペコードを生成しません。PHP が IS_IDENTICAL + JMPNZ チェーンにコンパイルするため、すでに対応しています。
🔢 演算子
SUPPORTED 算術・比較・論理・文字列演算子
+-*/%=====&&||!. などが動作します(オブジェクト等値比較の制限については前述を参照)。
SUPPORTED 三項演算子・Elvis 演算子
? :(ネスト含む)と ?:(Elvis)が goto ベースの条件分岐に変換されます。
SUPPORTED エラー抑制演算子(@
@ 演算子が対応しています。BEGIN_SILENCE でエラー報告を無効化し、END_SILENCE で復元します。
SUPPORTED instanceof 演算子
ユーザー定義クラス・組み込みクラス双方に対して完全に対応しています。継承チェーン・インターフェース・可変クラス名も動作します。
SUPPORTED スプレッド演算子(...
呼び出し側でのスプレッド(func(...$args))が完全に対応しています。
SUPPORTED Null 合体演算子(??)・Null 合体代入(??=
????= が完全に対応しており、goto ベースのコードに変換されます。
SUPPORTED Null 安全演算子(?->
?-> が対応しています。オブジェクトが null の場合に呼び出しチェーンをショートサーキットします。
SUPPORTED isset() / empty()
変数・配列要素・オブジェクトプロパティに対して動作します。
📚 配列
SUPPORTED 配列の作成・アクセス・組み込み配列関数
配列の作成とアクセスが動作します。array_pusharray_popcountarray_key_existsin_array などの組み込み関数も対応しています。
SUPPORTED 配列の分割代入([$a, $b] = $array
list() 関数と短縮記法 [] の両方が対応しています。連想配列のデストラクチャリングも動作します。
🔤 文字列操作
SUPPORTED 文字列連結・組み込み文字列関数
. 演算子と組み込み文字列関数が動作します。
SUPPORTED 文字列補間("Hello $name"
ダブルクォート文字列内の変数展開が完全に対応しています。配列要素({$arr['key']})やオブジェクトプロパティ({$obj->name})の補間も動作します。
SUPPORTED Heredoc / Nowdoc
両方の複数行文字列構文が完全に対応しています。Heredoc は変数展開あり、Nowdoc は変数展開なしです。
📌 変数操作
SUPPORTED 代入・複合代入演算子
+=-=*=/=.=%= などの複合代入演算子がすべて対応しています。
SUPPORTED インクリメント・デクリメント
前置(++$i--$i)と後置($i++$i--)の両方が式中でも対応しています。
SUPPORTED 参照(&$var
参照代入($b = &$a)と参照渡し(function foo(&$param))が対応しています。
SUPPORTED unset()
変数・配列要素・オブジェクトプロパティに対して対応しています。
SUPPORTED グローバル変数(global$GLOBALS
global 文と $GLOBALS 配列の両方が完全に対応しています。グローバル変数は $_globals 配列に格納されます。
🏷 型システム
SUPPORTED 型キャスト
(int)(string)(array) などのキャストが動作します。
SUPPORTED 型チェック関数
is_string()is_int()is_null()is_array()is_float()is_bool()is_object()is_resource() が対応しています。
NOT SUPPORTED 型宣言・declare(strict_types=1)
型ヒントと strict_types 宣言は無視されます。
SUPPORTED 名前空間(namespaceuse
名前空間が完全に対応しています。PHP コンパイラがコンパイル時にすべての参照を完全修飾名に解決します。生成コードでは \__NS__ に置換されます。
SUPPORTED 定数(constdefine()
コンパイル時定数(const)と実行時定数(define())の両方が対応しています。定数はグローバルな $_const 配列に格納されます。
NOT SUPPORTED アトリビュート(#[Attribute]
対応しません。アトリビュートはオペコードを生成しないため、変換プロセスでは無視されます。
SUPPORTED 名前付き引数
順序不同・位置引数との混在が、ユーザー定義関数・メソッドに対して動作します。
⚠️ エラーハンドリング
SUPPORTED try-catch ブロック
例外処理が完全に対応しています。単一・複数の catch ブロック、例外クラス階層の照合、スコープをまたいだ例外伝播、ネストされた try-catch が動作します。
制限: キャッチされなかった例外のエラーフォーマットが PHP ネイティブと異なります(スタックトレースなし)。
SUPPORTED throw
例外の送出が動作します。同スコープ内のハンドラへの直接 goto、関数スコープからのスタックアンワインド、グローバルスコープでの未処理例外の3つのケースすべてに対応しています。
SUPPORTED カスタム例外クラス
Exception などを継承したユーザー定義例外クラスが完全に対応しています。実行時に __builtin_define_class() で定義されます。
SUPPORTED finally ブロック
FAST_CALL/FAST_RET オペコードを goto ベースのサブルーチン呼び出しとして実装。finally ブロック実行後の戻り先をリターンラベル配列で管理し、ディスパッチャが元の処理に戻します。try-catch-finally・try-finally(catch なし)・例外伝播・ネストした finally に対応しています。
NOT SUPPORTED set_error_handler にクロージャを渡す
spaghetti クロージャは goto ベースのラベルシーケンスであるため、PHP 内部から呼び出すことができません。spaghetti クロージャを渡した場合、登録はスキップされます。
注意: 通常の PHP callable(名前付き関数の文字列など)を渡した場合は正しく動作します。