1

mysqli 拡張機能を使用して、結果をオブジェクトにバインドします。

class Item {
    public $id, $name;
    }
$Item = new Item;
$stmt->bind_result($Item->id, $Item->name);

を呼び出すたびに、$stmt->fetch()参照となった $Item のプロパティが上書きされます。オブジェクトを単純に複製すると、これらの参照は残り、両方のインスタンスが同時に変更されます。

object(Item)#1 (2) {
  ["id"]=>
  &int(1)
  ["name"]=>
  &string(4) "name"
}

したがって、それらを逆参照する方法があるはずなので、clone参照されるデータのセットではなく、実際にコピーを作成します。オブジェクトの配列として格納されるように、すべてのデータを取得する簡単で柔軟な方法はありますか? 主な問題は、参照を削除する方法です: &string.

私が見る唯一の解決策は、別のオブジェクトをインスタンス化し、すべてのプロパティを手動でコピーすることです。

$Item2 = new Item;
foreach ($Item as $prop => $val)
    $Item2->$prop = $val;

しかし、これはやり過ぎのようです: すべてのプロパティ (実際には参照されなかったいくつかの余分なプロパティを含む) がコピーされますが、これは必要ではありません。

4

2 に答える 2

1

オブジェクトの参照されていないコピーを作成するように、独自の __clone() マジック関数を実装できます。うまくいくはずだと思います。

http://www.php.net/manual/en/language.oop5.cloning.php

<?php

class Item {
  public $id, $name;

  public function __clone() {
    $id = $this->id;
    unset($this->id);
    $this->id = $id;
    $name = $this->name;
    unset($this->name);
    $this->name = $name;
  }
}

$id = 1;
$name = 'o_0 Tync';

$i1 = new Item();
$i1->id = &$id;
$i1->name = &$name;

$i2 = clone $i1;

$id = 2;
$name = 'Mchl';
var_dump($i1,$i2);

出力

object(Item)#1 (2) {
  ["id"]=>
  &int(2)
  ["name"]=>
  &string(4) "Mchl"
}
object(Item)#2 (2) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(8) "o_0 Tync"
}

地獄のように醜いが、うまくいく...

于 2010-08-02T19:41:39.203 に答える
0

私の理解が正しければ、データをオブジェクトにフェッチしたいですか? MysqlI には fetch_object メソッド/関数があります: http://www.php.net/manual/en/mysqli-result.fetch-object.php次のように使用します:

$foobar = $conn->escape_string($foobar);
$stmt = $conn->query("SELECT * FROM foo WHERE bar = '$foobar'");
while ($item = $stmt->fetch_object("Item")) {
    $items[] = $item;
}
$stmt->close();
于 2010-08-02T19:15:28.533 に答える