型と値のチェックを使用して異種データを保存および送信するための魔法のオブジェクト

PHPでは、通常、配列は異種データ(コンポーネント構成、関数のパラメーターセット、ウィジェットのオプションなど)の保存と送信に使用されます-汎用性と使いやすさがこれに大きく貢献しますが、次の問題が発生します。



  1. 開発中、高度なIDE(開発システム)およびアプリケーションの実行中であっても、配列の構造とデータ型を制御することはできません。
  2. IDEは開発中には何の役にも立ちません。そのため、可能な配列キーの名前をどこかに覚えて入力するか、検索してコピーして貼り付ける必要があります。これは、不便さとパフォーマンスの低下に加えて、タイプミスの可能性を高めます。
  3. この配列の個々の要素がどこでどのように使用されるかを制御することは難しく、したがって、最新のIDEの能力にもかかわらず、リファクタリングすることは困難です。




小規模なプロジェクトの場合、これらの問題はまだ取るに足らないものであり、そこですべてを制御するのは簡単ですが、コードボリュームの増加に伴い、より顕著になります。





問題2および3の解決を可能にする既知のアプローチの1つは、stdClassを拡張するそのような疑似クラスに基づいてオブジェクトを作成することです。 PHPDocで説明されているクラスのプロパティと、そのクラスのオブジェクトが(PHPDocで)使用されている場所の表示により、オートコンプリートが機能し、可能なプロパティ名を確認し、プロパティの適用場所を制御し、必要に応じて簡単にリファクタリングできます:

/** * @property integer $integer * @property integer[] $integers */ class DataStorage extend stdClass { } $ds=new DataStorage; $ds->integer=13; $ds->integers=[1,2,3];
      
      





しかし、値の制御に関する問題はそのような方法では解決されません.IDEの外部から来たデータは正確に制御されません。もちろん、誰かがIDEの警告を無視できるため、誤ったデータが予期しない場所で予期しないエラーを引き起こす可能性があることは言うまでもありません さらに、私の知る限り、PHPDocでは可能なプロパティ値のリストを指定することはまだ許可されていませんが、これはしばしば重要です。



PHPの魔法を追加:StrictDataStorage


これらの問題の適切な解決策が見つからなかったため、彼はPHPDocに基づいてデータをチェックできるクラスを開発しましたが、追加のボーナスとして、可能なリストに従って値をチェックします。 クラスは、stdClassを使用した上記のソリューションと同様に機能します。StrictDataStorageから継承されたクラスが作成され、 @property



タイプはPHPDocで@propertyを介して記述されます。 プロパティに値を割り当てると、値は記述されたタイプに準拠しているかどうかが確認され、検証の結果が割り当てられるか、エラーハンドラーが起動します。デフォルトでは、例外がスローされます。 チェックするとき、callableを除くすべてのPHPDocデータ型をサポートし、いくつかの可能な型をリストします。 型の最後に[]で記述された配列。

@property



要素に加えて、 @property



@enum



および@options



@options







@enum





可能なプロパティ値のリストを指定できます。 インターネットで入手可能な情報を調査した結果、現時点ではこの問題に関する標準または合意さえ存在しないという結論に至ったため、今のところ、 @property



と競合しない独自のバージョンを@property



@enum



構文@enum



似てい@property



-最初に可能な値の説明があり、次にプロパティの名前があります。 可能な値は2つの方法で示されます。

  1. 角括弧内のリスト-角括弧の内容はjson_decode()を介して解析されるため、まずフォーマットする必要があります。つまり、二重引用符を使用して文字列を構成します。
  2. 値が格納されるクラスの名前。このクラスは、同じリポジトリにあるEnumArrayableInterfaceインターフェイスをサポートする必要があり、原則としてSplEnumサポートを作成できます。




@options





クラス操作の設定がコンマで区切られて含まれており、現在2つの値がサポートされています。







StrictDataStorageクラスは、ここでgithub.com/Yannn/php-strict-dataにレイアウトされています 。どのように機能するかを、そこに示されているSampleDataStorageの継承者の例を示します。

 <?php /** * @property integer $integer * @property Closure $callback * @property mixed $mixed * * @property integer[] $integers * @enum SampleEnum[] $integers * * @property float|string $enumFloat * @enum ["1.8","7","9"] $enumFloat * * @property string[] $enumArray * @enum ["one","two"][] $enumArray * * @options PhpDocNotRequired|StrictNumberTypeCheck */ class SampleDataStorage extends StrictDataStorage { }
      
      





なぜなら SampleDataStorageクラスのオブジェクトに@options PhpDocNotRequired



を指定した場合、任意のプロパティに値を割り当てることができますが、プロパティ$ integer、$ callback、$ mixed、$ integers、$ enumFloat、$ enumArrayを割り当てると、値は@property



および@enum



説明されているルールに従ってチェックされます:



値が指定されたルールと一致しない場合、例外がスローされます。 エラー処理メソッドは保護されて実装されているため、エラーの動作は継承によって簡単に変更できます。



要件、互換性


なぜなら 私は長い間PHP 5.4を使用していますが、このクラスにはPHP> = 5.4も必要です。他に特別な要件はないようです。



私はコメント、提案、そしてもちろんバグレポートを喜んでいます。



All Articles