我正在尝试使用以下内容获取Image对象数组:
(如果我运行原始MySQL查询,我会返回3个不同的行,所有行都有不同的值,显然除了product_id
。)
$query = 'SELECT * FROM `j_images` WHERE product_id = :product_id';
$stmt = $db_conn->prepare($query);
if($stmt)
{
$I = new \jenis\Product\Image();
$stmt->setFetchMode(PDO::FETCH_INTO, $I);
$result = $stmt->execute(array('product_id'=>$product_id));
if($result)
{
$images = $stmt->fetchAll();
var_dump($images);
}
}
包含3个jenis\Product\Image
个对象的数组,但对象(包括引用)是相同的。
包含3个\jenis\Product\Image
个对象的数组,每个对象都是唯一的。
这是因为它正在获取同一个对象(即$I
)吗?如果是这样,有办法解决这个问题吗?
然而,PHP文档中的Example 4会让我相信这是可能的。
如果我直接从文档中跟随示例:
$images = $stmt->fetchAll(PDO::FETCH_CLASS, "\jenis\Product\Image");
,我得到三个单独的对象,但所有属性都是NULL
。
以下是我的Image Class的精简版:
namespace jenis\Product;
use jenis\DB as DB;
use \PDO as PDO;
class Image
{
public $id;
public $product_id;
public $url;
public static function getImagesByProduct($product_id)
{
… code outlined above …
}
}
上面列出的代码是作为静态方法执行的(例如Image::getImagesByProduct($product_id);
答案 0 :(得分:1)
这不起作用的原因是因为我开发了构造函数以便可以传递可选参数。
例如:
function __construct($name='', $description='')
{
$this->name = $name;
$this->description=$description;
}
因为在调用FETCH_CLASS
时使用构造函数,这导致我的变量为NULL
,因为属性不作为参数传递。正如@Digital Chris所说,我需要PDO::FETCH_PROPS_LATE
,它允许在调用构造函数之后设置属性。