2010-12-03 7 views
0

既に設定したパラメータのgetおよびsetメソッドをオーバーライドすることはできますか?だから、私がパラマウントを設定するたびに、私はそれを使って作業するためのアクセス権を持っています/それを検証しますか?PHPのオーバーライド設定メソッド

class User { 

    public $username; 

    function custom_set($name, $value) { 
     if(strlen($value) < 5) { 
     return "not long enough"; 
     } else { 
     $this->$name = $value; 
     } 

    } 
} 

$u = new User(); 
$u->username = "ted"; 
echo $u->username; 

出力:「十分な長さではない」

これは私がちょうど書いた非常に単純化した例であり、おそらくそれは私が何をしようとしています何を伝えることだけですが、エラーが含まれています。

基本的に私が$u->username = "anything";と呼ぶ度に、custom_setメソッドを呼びたいと思います。

が、私はコンストラクタで検証を行うにはしたくないと私は$u->setVal("ted");

のような別のメソッドを作成したくない、これは可能ですか?

+1

* *パラメータ*を格納するための単純な配列を使用せず、本当の*オブジェクトプロパティ*を使用しないのはなぜですか?あなたの '__set'と' __get'マジックメソッドは、未定義属性のために呼び出されるだけです: "このメソッドは、未定義属性のデータを取得しようとすると自動的に呼び出されます"という理由で、常に – dcestari

答えて

2

これらの属性をprotectedまたはprivateに設定してから__get__setを呼び出し、必要なロジックに委任できます。

個人的には、何かのためにpublicプロパティを使用することを検討するケースはまだありません。

+0

DTOもあります。適切なコーディングの世界へようこそ。 – Andrew

+0

DTO/VOは適切な使い方ですが、 'StdClass'、' SoapVar'、 'SoapParam'のような内部クラスを数えない限り、PHPで使われているパターンはめったにありません。 – prodigitalson

+0

そして私はこれが悲しい(希少性について)と言っています。データ操作とデータ操作を混在させないようにし、これらを別々のオブジェクトに分ける必要があります。 – Andrew

0

あなたはMagic Methodsについて話していますか?

+0

と呼ばれます。私は上記の例で '$ username'のように既に定義した属性について話しています。 – imns

3

__setメソッドを実装します。これは、アクセスできないプロパティにアクセスしようとしたときに呼び出されます。

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

$usernameは、それがprivateまたはprotected宣言されていない限り、これは動作しません公共の財産であることに注意してください、、。

+0

__get – Webnet

関連する問題