2011-08-11 10 views
3

私はMySQLiクラスを継承するカスタムdbクラスを持っています MySQLi-> query()メソッドはMySQLi_Resultクラスでobejctを返しますが、このクラスのfuncionalityを何とか拡張したい結果オブジェクトをMyResultクラスにします。このようなもの:あるクラスのインスタンスを別のクラスのインスタンスにするには

class MyResult extends MySQLi_Result{ 
    function abc(){ 
    //... 
    } 
} 

class MyDB extends MySQLi{ 
    function q($query){ 
    return /*Here some magic*/ $this->query(); 
    } 
} 

$db=new MyDB(); 
$res=$db->q('SEL...'); 
$res->abc(); 

これを行う方法?

編集: これは重複していると言う人もいますが、ここでの問題は深いです。 $ resultオブジェクトがMysqli_resultクラスのobectのように動作する必要があるので、古いコードが動作する必要があります。 だから私は、私のようなオリジナルのMysqli_resultメソッドを呼び出すことができていることが必要です。

MyResultが必要になります
class MyResult { 

     private $result; 

     function __construct(MySQLi_Result $result) 
     { 
      $this->result = result; 
     } 
    //Here some methods that use $this->result as you wish 
    } 

    class MyDB extends MySQLi{ 
     function q($query){ 
     return new MyResult($this->query($query)); 
     } 
    } 

    $db=new MyDB(); 
    $res=$db->q('SEL...'); 
    $res->myMethod(); 
+0

が重複する可能性[mysqli_resultを拡張](http://stackoverflow.com/questions/6195377/extend-mysqli-result) – Gordon

+0

ちょうどあなたのMyResultのメソッド "FETCH_ASSOC" を追加します。それはMySQLi_Result(関数fetch_assoc(){return $ this-> result-> fetch_assoc();})と同じメソッドに委譲します。ボーナスは、この関数に独自のロジックを追加することもできます(たとえば、ページのノーバーをカウントするなど)、あなたの古いコードは引き続き機能します。 – Mironor

+0

@Mironor OPは 'mysqli_fetch_object(mysqli_result $ result [、string $ class_name [、array $ params]])を使用することもできますが、カスタムの' MySqli_Result'クラスを返すのではなく、クエリされたデータのカスタムオブジェクトを返します。 – Gordon

答えて

4

をあなたはDecorator pattern だからあなたのコードでは、なりを適用することができますquery()の出力を格納し、必要に応じてラップするコンストラクタです。

+0

この回答を受け入れるコメントと組み合わせて私の問題を解決します。 – codez

0

 
class MyDB extends MySQLi{ 
    function q($query){ 
    return new MyResult($this->query()); 
    } 
} 

$res->fetch_assoc(); 

//but not 
$res->result->fetch_assoc(); 
0

おそらくこのようなものです。

class MyDb extends MySQLi { 
    function query($query) { 
     $result = parent::query($sQuery); 
     return new MyDbResult($result); 
    } 
} 
0

あなたの質問を正しく理解しているかどうかはわかりませんが、このように見えます。

class MyResult extends MySQLi_Result{ 
function __Contstruct($ob) 
{ 
    return $this->abc($ob); 
} 
function abc($object){ 
    //your magic 
} 
} 

class MyDB extends MySQLi{ 
    function q($query){ 
    $ob = $this->query($query); 
    return new MyResult($ob); 
    } 
} 
関連する問題