PHPコードジェネレータ
- PHPの最新機能(プロパティフック、enum、属性など)をすべてサポート
- 既存のクラスを簡単に変更できます
- 出力コードはPSR-12 / PERコーディングスタイルに準拠しています
- 成熟し、安定し、広く使用されているライブラリ
インストール
ライブラリはComposerツールを使用してダウンロードおよびインストールします:
PHPとの互換性は互換性テーブルで確認できます。
クラス
まず、ClassTypeを使用してクラスを作成する例から始めましょう:
次の結果を返します:
コードを生成するために、いわゆるプリンタを使用することもできます。これはecho $class
とは異なり、さらに設定できます:
定数(クラスConstant)とプロパティ(クラスProperty)を追加できます:
生成されるもの:
そして、メソッドを追加できます:
結果は:
PHP 8.0で導入されたプロモートされたパラメータは、コンストラクタに渡すことができます:
結果は:
読み取り専用のプロパティとクラスは、関数 setReadOnly()
を使用してマークできます。
追加されたプロパティ、定数、メソッド、またはパラメータが既に存在する場合、例外がスローされます。
クラスのメンバーは、removeProperty()
、removeConstant()
、removeMethod()
、またはremoveParameter()
を使用して削除できます。
クラスに既存のMethod
、Property
、またはConstant
オブジェクトを追加することもできます:
cloneWithName()
を使用して、既存のメソッド、プロパティ、および定数を別の名前でクローンすることもできます:
インターフェースまたはトレイト
インターフェースとトレイトを作成できます(クラスInterfaceTypeとTraitType):
トレイトの使用:
結果:
Enums
PHP 8.1で導入されたEnumは、次のように簡単に作成できます:(クラスEnumType):
結果:
スカラー等価物を定義して、「backed」enumを作成することもできます:
各caseにコメントまたは属性をaddComment()
またはaddAttribute()
を使用して追加できます。
匿名クラス
名前としてnull
を渡すと、匿名クラスが作成されます:
結果:
グローバル関数
関数のコードはクラスGlobalFunctionによって生成されます:
結果:
匿名関数
匿名関数のコードはクラスClosureによって生成されます:
結果:
短縮アロー関数
プリンタを使用して、短縮された匿名関数を出力することもできます:
結果:
メソッドと関数のシグネチャ
メソッドはクラスMethodによって表されます。可視性、戻り値の型を設定したり、コメント、属性などを追加したりできます:
個々のパラメータはクラスParameterによって表されます。ここでも、考えられるすべてのプロパティを設定できます:
いわゆる可変長引数パラメータ(またはスプラット演算子)を定義するには、setVariadic()
を使用します:
生成されるもの:
メソッドと関数の本体
本体はsetBody()
メソッドに一度に渡すか、addBody()
を繰り返し呼び出して段階的に(行ごとに)渡すことができます:
結果
特別なプレースホルダーを使用して、変数を簡単に挿入できます。
単純なプレースホルダー ?
結果
可変長引数のプレースホルダー ...?
結果:
PHP 8の...?:
を使用して、名前付きパラメータを使用することもできます:
プレースホルダーはバックスラッシュ\?
でエスケープされます
結果:
プリンタとPSR準拠
PHPコードの生成にはクラスPrinterを使用します:
他のすべての要素のコードを生成でき、printFunction()
、printNamespace()
などのメソッドを提供します。
PsrPrinter
クラスも利用可能で、その出力はPSR-2 / PSR-12 /
PERコーディングスタイルに準拠しています:
動作をカスタマイズする必要がありますか?
Printer
クラスを継承して独自のバージョンを作成します。次の変数を再設定できます:
標準のPrinter
とPsrPrinter
は実際にはどのように、そしてなぜ異なるのでしょうか?
なぜパッケージにはPsrPrinter
だけでなく、1つのプリンタしかないのでしょうか?
標準のPrinter
は、Nette全体で行っているようにコードをフォーマットします。NetteがPSRよりもずっと前に登場したこと、そしてPSRが長年にわたって標準をタイムリーに提供せず、PHPの新機能が導入されてから数年遅れて提供することもあったため、コーディング標準はいくつかの細かい点で異なります。
大きな違いは、スペースの代わりにタブを使用することだけです。プロジェクトでタブを使用することで、視覚障害を持つ人々にとって不可欠な幅のカスタマイズが可能になることを知っています。
小さな違いの例としては、関数とメソッドの波括弧を常に別の行に配置することです。PSRの推奨は非論理的であり、コードの可読性の低下につながると考えています。
型
各型またはunion/intersection型は文字列として渡すことができ、ネイティブ型には事前定義された定数を使用することもできます:
setReturnType()
メソッドにも同じことが当てはまります。
リテラル
Literal
を使用すると、プロパティやパラメータのデフォルト値など、任意のPHPコードを渡すことができます:
結果:
Literal
にパラメータを渡し、プレースホルダーを使用して有効なPHPコードにフォーマットさせることもできます:
新しいオブジェクトの作成を表すリテラルは、new
メソッドを使用して簡単に生成できます:
属性
PHP 8属性は、すべてのクラス、メソッド、プロパティ、定数、enum、関数、クロージャ、およびパラメータに追加できます。パラメータ値としてリテラルを使用することもできます。
結果:
プロパティフック
プロパティフック(クラスPropertyHookで表される)を使用して、PHP 8.4で導入された機能であるプロパティのgetおよびset操作を定義できます:
生成されるもの:
プロパティとプロパティフックは、abstractまたはfinalにすることができます:
非対称可視性
PHP 8.4では、プロパティの非対称可視性が導入されました。読み取りと書き込みに対して異なるアクセスレベルを設定できます。
可視性は、2つのパラメータを持つsetVisibility()
メソッドを使用するか、またはsetPublic()
、setProtected()
、またはsetPrivate()
メソッドを使用し、可視性がプロパティの読み取りまたは書き込みに適用されるかどうかを指定するmode
パラメータを使用して設定できます。デフォルトのモードは'get'
です。
生成されるもの:
Namespace
クラス、プロパティ、インターフェース、およびenum(以下、クラス)は、クラスPhpNamespaceで表される名前空間にグループ化できます:
クラスが既に存在する場合、例外がスローされます。
use句を定義できます:
定義されたエイリアスに従って、完全修飾クラス名、関数名、または定数名を簡略化するには、simplifyName
メソッドを使用します:
逆に、resolveName
メソッドを使用して、簡略化されたクラス名、関数名、または定数名を完全修飾名に変換できます:
クラス名の変換
クラスが名前空間の一部である場合、わずかに異なる方法でレンダリングされます: すべての型(例えば、タイプヒント、戻り値の型、親クラスの名前、実装されたインターフェース、使用されるプロパティ、および属性)は自動的に変換されます(これを無効にしない限り、下記参照)。 これは、定義で完全なクラス名を使用する必要があることを意味し、それらは結果のコードでエイリアス(use句に従って)または完全修飾名に置き換えられます:
結果:
自動変換は次のように無効にできます:
PHPファイル
クラス、関数、および名前空間は、クラスPhpFileで表されるPHPファイルにグループ化できます:
結果:
注意: 関数やクラス以外のコードをファイルに追加することはできません。
既存のものに基づく生成
上記で説明したAPIを使用してクラスや関数をモデル化するだけでなく、既存のパターンに基づいて自動的に生成させることもできます:
関数とメソッドの本体はデフォルトで空です。それらも読み込みたい場合は、この方法を使用します(nikic/php-parser
パッケージのインストールが必要です):
PHPファイルからの読み込み
PHPコードを含む文字列から直接、関数、クラス、インターフェース、およびenumを読み込むこともできます。例えば、このようにしてClassType
オブジェクトを作成します:
PHPコードからクラスを読み込む際、メソッド本体外の単一行コメント(例えば、プロパティなど)は無視されます。なぜなら、このライブラリにはそれらを操作するためのAPIがないためです。
任意の数のクラス、関数、または名前空間を含むPHPファイル全体を直接読み込むこともできます:
ファイルの冒頭のコメントとstrict_types
宣言も読み込まれます。逆に、他のすべてのグローバルコードは無視されます。
nikic/php-parser
がインストールされている必要があります。
ファイル内のグローバルコードやメソッド本体内の個々のステートメントを操作する必要がある場合は、nikic/php-parser
ライブラリを直接使用する方が良いでしょう。
Class Manipulator
クラスClassManipulatorは、クラスを操作するためのツールを提供します。
inheritMethod()
メソッドは、親クラスまたは実装されたインターフェースからメソッドをクラスにコピーします。これにより、メソッドをオーバーライドしたり、そのシグネチャを拡張したりできます:
inheritProperty()
メソッドは、親クラスからプロパティをクラスにコピーします。これは、同じプロパティをクラスに持ちたいが、例えば異なるデフォルト値を持つ場合に便利です:
implement()
メソッドは、指定されたインターフェースまたは抽象クラスのすべてのメソッドとプロパティをクラスに自動的に実装します:
変数の出力
Dumper
クラスは、変数を解析可能なPHPコードに変換します。標準のvar_export()
関数よりも優れた、より明確な出力を提供します。
互換性テーブル
PhpGenerator 4.1はPHP 8.0から8.4と互換性があります。