2009-08-01 27 views
1

私と一緒にいてください私はoopに新しいです! 関数の結果を属性に代入することはできますか?
おそらくこれは意味をなさないので、ここでコードがどのように見えるか考えてみましょう!基本的なphpクラスの問題

Class b extends a 
{ 
    public $conn= $this->connect(); 

    public function operation() { ...} 

} 

connect()データベースに接続し、成功した場合$resultを返すクラスAからの関数です。

答えて

9

はい、それは可能ですが、あなたはconstructorのような方法でそれを実行する必要があります。

あなたがインスタンス化したらあなたはメソッド内で接続するための呼び出しを入れて、その後、メソッドを呼び出す必要が
Class b extends a { 
    public $conn; 
    public function __construct() { 
     $this->conn = $this->connect(); 
    } 
    public function operation() { /* ... */ } 
} 
+0

で動作するように非常に迅速にあなたの基本的なセーブ()負荷()を見つける()のカウント()などを、行うためにDBable基本クラスを持っているしてください私の答えを見てください。あなたのクラスを派生させることができないか、 'connect'メソッドをオーバーライドできない限り、これは危険です。 –

0

クラスを使用して接続を初期化するか、コンストラクタメソッドを使用して自動的に行います。

0

connect()メソッドのどの実装が呼び出されるのかわからないので、これは一般的には悪い書式です。現在のクラスのクラスかスーパークラスのクラスか実際、PHPがこれを許可したとしても私は驚いています。

初期化はコンストラクタで行う必要がありますが、それでも初期化に関係します。別のメソッドを呼び出す必要がある場合は、上記と同じ問題が存在します。呼び出すメソッドのバージョン

しかし、あなたが記述したシナリオでは、宣言時にも、コンストラクタ内でも、メンバー変数を初期化しません。代わりに、$connをコンストラクタに渡します。これは依存性注入の基礎です。

+0

PHPはそのような機能を可能にします。実際、* B *が 'connect'をオーバーライドするとき、' $ conn'は* B *の 'connect'メソッドの戻り値になり、そうでなければ* A *の' connect 'メソッド。 – Gumbo

+0

私は2004年以来PHPを何もしていないので、私は訂正します。しかし、派生クラスがあなたのコンストラクタを破壊してクラスを無効にすることは保証できないので、コンストラクタから非finalメソッドを呼び出すことは悪いフォームであると私は依然として考えています。 元の著者はこれをショートカット(コードの繰り返しを避けるためにメソッド継承を使用)として使用したいと考えていますが、これは悪いです。私は彼がconstrutor(依存関係注入)への接続を渡すか、非最終メソッドへの呼び出しなしでコンストラクタ内の変数の初期化を行うことをお勧めします。 –

0

は、私は通常、あなたの接続の詳細を使用すると、1つの場所でそれらを変更し、変更する場合は、別のサーバーに接続する必要がある場合は、この

$link = mysql_connect(.....,......,......); 

Class b extends a { 
    public $conn; 
    public function __construct($link) { 
     $this->conn = $link; 
    } 
    public function operation() { /* ... */ } 
} 
$a = new b($link); 

のようなものは、あなたがして他のリンク変数を渡すことができません。

OOPのデータベース統合のためのもう一つのヒントは、常にデシベル保存可能なオブジェクト

BaseDBClass 
    A 
     B 
     C 
     D 
    X 
     Y 
     Z