PHP コードジェネレータ
- PHPの最新機能(プロパティ・フック、列挙型、属性など)をすべてサポート。
- 既存のクラスを簡単に修正することが可能
- PSR-12 / PERコーディングスタイルに準拠した出力
- 成熟し、安定し、広く使用されているライブラリ
インストール
Composerを使用して、パッケージをダウンロードし、インストールします。
PHPの互換性については、表を参照してください。
クラス
まずは、ClassType を使ってクラスを生成する簡単な例から見ていきましょう。
このような結果がレンダリングされます。
また、プリンタを使ってコードを生成することもできます。この場合、echo $class
とは異なり、さらに設定を行うことができるようになります。
定数(Constantクラス)やプロパティ(Propertyクラス)を追加することができます。
生成されます。
そして、メソッドを追加することができます。
という結果になります。
PHP 8.0 で導入されたプロモートパラメータをコンストラクタに渡すことができるようになりました。
その結果
Readonlyプロパティやクラスは、setReadOnly()
を使ってマークすることができます。
追加されたプロパティや定数、メソッド、パラメータがすでに存在する場合は、例外がスローされます。
メンバーは、removeProperty()
,removeConstant()
,removeMethod()
またはremoveParameter()
を使って削除することができます。
また、既存のMethod
,Property
またはConstant
オブジェクトをクラスに追加することもできます。
既存のメソッド、プロパティ、定数を別の名前でクローンするには、cloneWithName()
を使用します。
インターフェイスまたはトレイト
インターフェースや特性(クラスInterfaceType、TraitType)を作成することができます:
特性を利用する:
結果
列挙
PHP 8.1がもたらすenum(クラスEnumType)を簡単に作成することができます:
結果
また、ケースに対してスカラー等価物を定義し、裏付けされたenumを作成することができます。
addComment()
またはaddAttribute()
を用いて,各ケースに対してコメントや属性を追加することが可能です.
匿名クラス
名前をnull
とすると、匿名クラスができます。
結果
グローバル機能
関数のコードは、クラスGlobalFunction を生成します。
結果
閉鎖
クロージャのコードは、クラスClosureを生成します。
結果
アロー関数
プリンターでクロージャを矢印機能として印刷することもできます。
結果
メソッドと関数のシグネチャ
メソッドはMethodというクラスで表現されます。可視性の設定、戻り値の設定、コメントや属性の追加などが可能です。
各パラメーターはParameterクラスで表されます。ここでも、考えられる限りのプロパティを設定することができる。
いわゆる variadics パラメータ(あるいは splat, spread, ellipsis, unpacking, three dots
オペレータ)を定義するには、setVariadic()
を使用します。
を生成する。
メソッドと関数本体
本体は、setBody()
メソッドに一度に渡すこともできますし、addBody()
を繰り返し呼び出すことで順次(一行ずつ)渡すこともできます。
結果
特別なプレースホルダーを使用することで、変数を注入する便利な方法があります。
単純なプレースホルダー ?
結果
可変長プレースホルダー...?
結果
PHP 8
の名前つきパラメータは、プレースホルダを使用して使用することもできます。...?:
スラッシュを使用してプレースホルダをエスケープします。\?
結果
プリンターとPSRの適合性
Printerクラスは、PHPコードを生成するために使用されます:
printFunction()
,printNamespace()
などのメソッドを提供し、他のすべての要素のコードを生成することができます。
さらに、PSR-2 / PSR-12 / PERのコーディングスタイルに準拠した出力が可能なPsrPrinter
クラスが用意されています:
ニーズに合わせて動作を細かく調整する必要がある?Printer
クラスを継承して、独自のプリンターを作成します。これらの変数を再設定することができます:
標準のPrinter
とPsrPrinter
は、具体的にどのように、なぜ違うのでしょうか?なぜ、パッケージにはPsrPrinter
という1つのプリンターしかないのでしょうか?
標準のPrinter
は、私たちがすべての Nette
で行っているようにコードをフォーマットしています。Nette は PSR
よりもずっと前に作られたものであり、また PSR は何年も前から標準規格が間に合わず、時には
PHP の新機能の導入から数年遅れることもあったため、結果としてコーディング標準にいくつかの小さな違いが生じました。
より大きな違いは、スペースの代わりにタブを使用することだけです。私たちは、プロジェクトでタブを使用することで、視覚障害者にとって必要不可欠な幅の調整を可能にすることを知っています。
細かい違いの例としては、関数やメソッドと常に別の行に中括弧を配置することが挙げられます。私たちは、PSRの勧告が非論理的であり、コードの明瞭性を低下させるものと考えています。
タイプ
各タイプやユニオン/交差タイプは、文字列として渡すことができます。また、ネイティブタイプには定義済みの定数を使用することもできます。
同じことが,setReturnType()
というメソッドにも当てはまります.
リテラル
Literal
を使用すると、任意の PHP
コードを、例えばデフォルトのプロパティやパラメータの値などに渡すことができます。
結果
Literal
にパラメータを渡すと、特別なプレースホルダーを使って有効な PHP
コードにフォーマットさせることもできます。
新しいオブジェクトの生成を表すリテラルは、new
メソッドで簡単に生成できる:
属性
PHP 8 の属性を、すべてのクラス、メソッド、プロパティ、定数、enum case、関数、クロージャ、パラメータに追加することができます。リテラルもパラメータの値として使用できます。
結果
プロパティ・フック.toc-property-hooks
これは PHP 8.4 で導入された機能です:
これは PHP 8.4 で導入された機能です:
プロパティとプロパティ・フックは、抽象でも最終でもかまいません:
非対称の可視性.toc-asymmetric-visibility
PHP 8.4 では、プロパティに非対称な可視性が導入されました。読み書きで異なるアクセスレベルを設定することができます。
可視性を設定するには、setVisibility()
メソッドに2つのパラメータを指定するか、setPublic()
,setProtected()
,setPrivate()
のいずれかにmode
パラメータを指定します。デフォルトのモードは'get'
です。
これは生成されます:
名前空間
クラス、trait、interface、enum(以下クラス)は、名前空間(PhpNamespace)にグループ化することができます。
クラスがすでに存在する場合は、例外をスローします。
use-statementsを定義することができます。
定義されたエイリアスに従って、完全修飾されたクラス、関数、定数名を簡略化するには、simplifyName
メソッドを使用します。
逆に、簡略化されたクラス名、関数名、定数名を完全修飾名に変換するには、resolveName
メソッドを使用します。
クラス名の解決
すべての型(例:型ヒント、戻り値型、親クラス名、実装されたインターフェイス、使用された特性、属性)は自動的に 解決 されます(オフにしない限り。) つまり、完全に修飾されたクラス名** を定義に使用する必要があり、結果のコードではエイリアス(use句に基づく)または完全に修飾された名前に置き換えられます:
結果
この方法で自動解像度をオフにすることができます。
PHPファイル
クラスや関数、名前空間は、PhpFile というクラスで表される PHP ファイルにまとめることができます。
結果
**注意:*** 関数やクラス以外のコードをファイルに追加することはできません。
既存のものに合わせて生成する
上記のAPIを使ってクラスや関数をモデリングすることができるだけでなく、既存のものを使って自動的に生成させることもできます。
関数やメソッドのボディはデフォルトでは空です。もし、それらもロードしたい場合は、次の方法を使います。
(を使います(nikic/php-parser
がインストールされていることが必要です)。
PHPファイルからの読み込み
また、関数、クラス、インターフェイス、列挙型を PHP
のコード列から直接読み込むこともできます。例えば、このようにして ClassType
オブジェクトを作成します:
PHP コードからクラスを読み込む際、メソッド本体の外側にある一行コメントは無視されます (例えば、プロパティなど)。これは、このライブラリがそれらを扱う API を持っていないためです。
また、PHP ファイル全体を直接読み込むこともできます。このファイルには、任意の数のクラスや関数、あるいは複数の名前空間が含まれる可能性があります:
初期ファイルコメントと strict_types
宣言もロードされます。一方、その他のグローバルコードはすべて無視される。
これには nikic/php-parser
がインストールされている必要がある。
ファイル内のグローバルコードやメソッド本体内の個々のステートメントを操作する必要がある場合は、
nikic/php-parser
ライブラリを直接使用するのがよい。
クラス・マニピュレーター.toc-class-manipulator
ClassManipulatorクラスは、クラスを操作するためのツールを提供します。
inheritMethod()
メソッドは、親クラスまたは実装されたインターフェイスのメソッドをあなたのクラスにコピーします。これにより、メソッドをオーバーライドしたり、シグネチャを拡張したりできます:
inheritProperty()
メソッドは、親クラスからあなたのクラスにプロパティをコピーします。これは、同じプロパティを自分のクラスにも持たせたいが、デフォルト値が異なる可能性がある場合に便利です:
implement()
メソッドは、指定されたインターフェイスまたは抽象クラスのすべてのメソッドとプロパティを自動的に実装する:
変数ダンパ
ダンパは、変数のパース可能な PHP 文字列表現を返します。ネイティブ関数var_export()
よりも、より良い、明確な出力を提供します。
互換性テーブル
PhpGenerator 4.1はPHP 8.0から8.4と互換性があります。