2011-12-09 5 views
2

私は主な親クラスを編集せずに拡張可能にしたいと考えているPHPで検証クラスを書いています。私は以下の単純化されたバージョンを、私が達成したいと思っているものを提供しました。私はfunction/methodの名前をvalidate()に渡しています。これは最初に存在するかどうかをチェックし、渡された変数をチェックするためにそれを呼び出す場合に有効です。親クラスの子クラスの名前をハードコーディングせずに、子クラスのカスタム検証ルールを取得できないため、OOPの新機能でスコープ/可視性に問題があります。これについて最善の方法は何ですか?あなたが提供できるあらゆる支援に感謝します。バリデーションクラスを拡張可能にするにはどうしたらいいですか?

$rule = "number"; 
$var = "abcdef"; 

class Validation 
{ 
    public static function validate($rule, $var) { 
     if (is_callable("self::{$rule}")) { 
      return self::$rule($var); 
     } 
    } 

    protected static function number($var) { 
     return (preg_match("/^[0-9]+$/i", $var)); 
    } 
} 

class MyRules extends Validation 
{ 
    public static function letter($var) {  
     return (preg_match("/^[a-zA-Z]+$/i", $var)); 
    } 
} 

print MyRules::validate($rule, $var) ? "Valid!" : "Not valid!"; // Not valid! 

答えて

2

まず、あなたがfinalキーワード使用validate方法の上書きを防ぐことができます。サブクラスの静的メソッドを呼び出すことができないためとして

public static final function validate($rule, $var) { 

を、これはLate Static Bindingを使用して行うことができます。

class Validation { 
    public static final function validate($rule, $var) { 
     if (is_callable("static::$rule")) { 
      return static::$rule($var); 
     } 
    } 
} 
+0

私はあなたがこれを行うことができたことを知らなかった!非常に便利。私はあなたが静的に1つのコロンを逃したと思う::キーワード – Dan

+0

ああ、ありがとう、ありがとう、これは5.3のように新しいです。 – Ross

+0

Brilliant!それは完璧に働いた。ロスに感謝します。 – Askives

0

これはstrategy design patternの仕事のようです。アルゴリズムのさまざまなバリエーションが必要な場合は、検証の際に使用できます。

+0

ありがとうございます。役に立つリソースのように見えます。 – Askives

0

私自身のフレームワーク/ライブラリで動作する方法は次のとおりです。

ほとんどのn層システムと同様に(MVCはそのような)、データをチェックしなければならないb4それはバックエンド層(データベース)に渡されます... mvc arhitecture uではdbテーブルにcorespoindentであるモデルを作ることができます。接続と検証...そのモデルクラスはそのテーブルのデータのみを知る必要があります。

もしullがポイントに達して、検証が何らかのルーチンになったら...あなたが作ることができますライブラリー...またはあなたは、どのようなデータがどのようなデータを持っているかを最初から考えることができます。

PS :したがって、テーブルの各データ型に対して、検証がライブラリを作成し、対応するdbデータ型のlib検証メソッドを呼び出す場合は、対応する検証を書き込みます

+0

これは確かに有効な働き方です。私はちょうど彼自身の図書館の一部だと思った。 – Dan

+0

検証のためのライブラリを作るのは難しいです...そのタイプのデータがどのタイプのデータから始めるのかを知ることは難しいです... ofcはスケールに依存します... – Tudor

+0

私が書いている検証クラスは補完することです私が一緒にしているフォーム生成クラスは、何よりも学習エクササイズとして、それはかなり整形されていますが、私は自分のプロジェクトで使っています。 – Askives

関連する問題