2011-01-06 9 views
0

私はかなり長い間これを探しています。 似たような疑問がいくつか見えましたが、doctrine2とこの問題が適用されるかどうかはわかりません。 私はCodeIgniter2とDoctrine2を使い始めていますが、いくつか問題があります。私はPHPでOOPの達人ではありません。 私はMainObjectをCRUDなどのメソッドを含むようにしたいと思います。オブジェクトにそのクラスを拡張して親のメソッドを使用させたいが、子のプロパティを使用したい。 Doctrine2はオブジェクトのプライベートプロパティを使用するので、親クラスからこれらのメソッドにアクセスすることはできません。たとえば:doctrine2とcodeigniter2、親クラスが子プロパティとやりとりするための正しいアプローチ

Class MainObject{ 
    public function validateFields(){ 
     //go over each field and validate/update if needed 
    } 
    public function store(){ 
     // do some validation, some logic, store, etc... 
    } 
    } 
    Class User extends MainObject{ 
    /** 
     * @Column(type="string", length=32, unique=true, nullable=false) 
     */ 
     private $username; 

     /** 
     * @Column(type="string", length=64, nullable=true) 
     */ 
     private $email; 

    } 

今、私はちょうど

$user = new User(); 
//set properties, somehow 
$user-__set($something); 
//call validation or store or some method from the parent that will interact with child properties 
$user->validate(); 
$user->store(); 
$user->uploadImage(); 
$user->formatPropertiesForSomethingSpecial(); 

を呼び出すしたいと思い、私はReflectionClassを使用してこれを行うことはほとんどありだが、私はこれをやっていることはよく分かりません正しい方法? また、MainObjectにすべてのメソッドを持たせる方法があります。ユーザーに渡すべきことを行うためにUserを渡すだけです。これはおそらく「ライター」アプローチですか?私はそれが私のプライベートプロパティで何かをすることをユーザーから許可するとは思わないが、私はUserが自分のゲッターとセッターを持つことができると思いますか?

私は半年でPHPで何年も働いていますが、これは私のために何か新しいものなので、アドバイス、チュートリアル、URL、批評など何でもありがとう。

答えて

0

最も簡単な(正しい)方法は、セッターを使用することです。

Class User extends MainObject{ 
    private $username; 
    private $email; 
    public function set_username($username) { 
     $this->username = $username; 
    } 
} 

あなたはそれがあまり冗長にしたい場合は、親に汎用のセッターを使用します。

Class MainObject{ public function validateFields(){ } public function store(){ } public function set($data) { foreach ($data as $key => $value) { if (property_exists($this, $key)) { $this->$key = $value; } } } } // Example $user = new User(); $data = array('username' => 'foo', 'email' => '[email protected]'); $user->set($data); $user->validate(); $user->store();

あなたは第二の方法のために、少なくともPHP> = 5.1が必要になります。

私は可視性のドキュメントを作成しました。プライベートではなく保護されたプロパティを使用するか、すべてのセッターを子クラスに書き込む必要があります。

+0

ありがとう、私はこれを使いたいと思っています。私は何をしたいのか分かりましたが、これはプライベートプロパティのためにはうまくいかず、うれしく思います。 致命的なエラー:プライベートにアクセスできないプロパティモデル\ User :: $ username in e:www \ application \ models \ object.php on line 80 このように、単純なVarとしてプロパティを作成すると、これは機能します。 クラスユーザーがメインオブジェクトを拡張します{ var $ username; var $ email; おそらく主な質問は、私が公開としてプロパティを設定するか、doctrine2が正しく動作するためにプライベートでなければならないことと、コードが安全であること、または何が起こる可能性があるかです。 ありがとう! – Dalibor

+0

保護された作品が期待通りに動作しました。ありがとうございました!私は保護されているという印象を受けました。 私はProtectedで作業を続け、計画通りにすべてがうまくいくことを願っています:) – Dalibor

+0

可視性の階層はPrivate Stephen

関連する問題