2012-04-28 9 views
0

私が正しく理解していれば、__set()を使うと、その場でクラス変数を作成することができます。これはpublicであり、private/protectedプロパティにアクセスできます。魔法の__set()のプロパティによるバリデーションの使い方は? (PHP)

これは、使用してのように思える:

__set($name,$value) { 
    $this->data[$name] = $value; 
} 

OR:

__set($name,$value) { 
    $this->$name = $value; 
} 

を... inとoutゴミのすべての種類の結果の両方でしょう。

個々のセッター(突然変異子)では、保護された/個人用のプロパティごとに1つずつ、個別の検証コントロールがありますが、セッターの束を書く必要があります。

魔法の__set()を利用する方法はありますか?それでも、プロパティによっては検証してください。

など。あなたの意見や感想を教えてください:

class stuff { 

    private $name; // alphabet, limit 10 chars 
    private $size; // integers 1 - 10; 
    private $price; // decimals 0.000 - 999.999 

    __set($property,$value) { 
    $this->$property = $value; 
    } 

} 

$thing = new stuff(); 
$thing->name = 1234; 
$thing->size = 'b'; 
$thing->price = -40; 

どのように悪い割り当てを検証しますか?

+1

私はバックアップできるものではなく、意見ですが、私は魔法を避けようとしています。また、プロパティのカスタムロジックが必要な場合は、セッターを作成することもできます。これは、ロジックの便利な場所を提供します。 – Corbin

+0

私はあなたがセッターを非公開にして__set()を使ってそれらにアクセスし、戻り値を得ることができると考えていました。あなたは$ thing-> name = 1234を使うことができます。依然として個々のセッター機能を有する。 –

+0

ええ、私がそれをしたら、私はセッターを公開しておきます。 (また、私は__setと__getに大きく偏っています。彼らが提供する '魔法'は、明示的な文書化をしなくても、クラスの構造が外部から非常に難しいことも知っています) – Corbin

答えて

0

各プロパティをバリデータでマップする配列を作成し、__setメソッドでそのプロパティと値に割り当てられたバリデータを実行できます。

1

これはあなた次第です。オブジェクトのプロパティを設定するためにマジックメソッドを使用することを主張する場合は、そのクラスにデータ検証の責任を負わせるかどうか、またはそれが別のオブジェクト(またはオブジェクトのセット)のジョブである必要があるかどうかを判断する必要があります。

+0

別のオブジェクトこのオブジェクトに入るものを検証しますか?他のオブジェクトがこのオブジェクトのプロパティについてあまり知っているはずですか? –

+0

議論の余地があります。検証を特に処理するオブジェクトを持つことは、IMHOにとって悪いことではありません。あなたが他のものを作ったときには、特定の選択肢に自分自身を強制する(例えば、__set()の使用を選択する) –

関連する問題