6

PDO の結果をコンストラクターのパラメーターとして渡す方法はありますか? たとえば、次のクラスがあるとします。

class Test
{
    private $value1;
    private $value2;
    function __construct($val1, $val2)
    {
        $this->value1 = $val1; $this->value2 = $val2;
    }
}

次に、PDO ドライバーを介して、DB からいくつかのデータを選択します。

SELECT price, quantity FROM stock

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test");

現在、PDO はこれらの値をクラス フィールドに直接渡し、コンストラクターをバイパスします。

何かが足りないのかもしれませんが、クエリの結果をコンストラクターに渡したいと思っています。コンストラクターをクエリ依存にすることはできません。PDO を使用しなくても、このクラスをインスタンス化できるようにしたいと考えています。

4

6 に答える 6

7

私が理解した唯一の方法は、FETCH_FUNC 定数を使用し、コンストラクターを介してオブジェクトを作成する関数を提供することでした。

function rowMapper( $price, $quantity)
{
  return new Test( $price, $quantity);
}
$results = $query->fetchAll( PDO::FETCH_FUNC, "rowMapper");

これで、PDO がプライベート データに値を挿入してカプセル化を解除する代わりに、コンストラクターを使用してのみオブジェクトが作成されます。

于 2015-10-08T23:06:38.937 に答える
3

何かが足りないのかもしれませんが、クエリの結果をコンストラクターに渡したいと思っています。

クエリの結果は、オブジェクト プロパティに直接割り当てることができます。PDO::FETCH_CLASS

必要に応じて PDO から値を上書きできるコンストラクターも必要なのでPDO::FETCH_PROPS_LATEfetch.

function __construct($val1=null, $val2=null) {

      // now the constructor is called after the fetch
      // if you pass values to it, they will be assigned

  if ($val1!==null) $this->price = $val1; 
  if ($val2!==null) $this->quantity = $val2;
}

オブジェクトをインスタンス化するには2つの方法があります

PDO

$stmt = $db->prepare('SELECT price, quantity FROM stock');
$stmt->setFetchMode(PDO::FETCH_CLASS,'Test');
$result = $stmt->fetch();

新着

$result = new Test(25,100);

データベースから取得した値を操作したい場合は、コンストラクターでそれを行うことができますFETCH_PROPS_LATE

function __construct($val1=null, $val2=null) {
  if ($val1!==null) $this->price = $val1;
  if ($val2!==null) $this->quantity = $val2;
  $this->formattedPrice = number_format($this->price,'2');
}
于 2014-06-12T20:26:10.467 に答える
1

[以前の回答が正確でなくなったため、この回答を編集しました。]

FETCH_CLASS はプライベート プロパティにフェッチします。この回答を参照してください。

于 2012-09-11T10:53:16.333 に答える
-1

あなたの場合、次のように渡すことができます:

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test", array('val1', 'val1'));

fetchAll() hereの 3 番目のパラメーターについてお読みください。

于 2014-09-18T08:37:23.977 に答える