人们通常如何将mysqli结果变成对象?
使用自定义类时,我找不到fetch_object()的任何示例。假设以下设置
class Test1 {
function __construct(array $data) { ... }
}
class Test2 {
function __construct(array $data) { ... }
}
假设我有多个具有相同构造函数的类,如何动态实例化这些类?
我会想象这样的事情:
function customQuery($query, $class) {
// Get some data by mysqli query, assume we get the data as $result object
...
// Now I would like to store the data in an array with instances of $class
$array = array();
while ($obj = $result->fetch_object($class, ???) {
$array[] = $obj;
}
// Return the array with instances of $class
return $array;
}
我用什么作为我的问号的参数?我只知道Test1和Test2的类构造函数都想要一个关联数组作为输入(可能不是相同的长度!)。
最后,我只想做一些像
这样的事情$arr1 = customQuery('SELECT id, product FROM test1 LIMIT 10', 'Test1');
$arr2 = customQuery('SELECT id, name, address FROM test2 LIMIT 10', 'Test2');
如果你有更好的想法来实现我的目标,我当然会感激你的意见。
答案 0 :(得分:3)
看看“fetch_object”
你有一个参数$ class_name
来自文档: 要实例化的类的名称,设置属性并返回。如果未指定,则返回stdClass对象。
它将自动创建给定类的实例,并将设置属性。所以不需要传递数组 http://www.php.net/manual/en/mysqli-result.fetch-object.php
更多解释,
fetch_object只填充私有属性等(PHP Magic ......我不喜欢它)。
如果你的对象在构造函数中有必需的参数但你想从数据库中获取它,那么fetch_object允许你为构造函数定义参数,这样就可以构造它而不是抛出警告/错误。
class Test {
private $title;
public function __construct($required) {
}
}
$mysql->fetch_object('Test'); //will trigger errors/warnings
$mysql->fetch_object('Test', array(null)); //won't
你可以做的是simpel获取数组并构造对象
function query($query, $class) {
$data = $query->fetch_assoc();
$instance = new $class($data);
return $instance;
}
答案 1 :(得分:1)
此功能用处不大。
最好让你的对象的构造函数接受一个带有设置的数组并像这样使用
while ($row = $result->fetch_assoc($res) {
$array[] = new Foo($row);
}
另请注意,fetch_assoc / fetch_object并不总是可用于预处理语句。
答案 2 :(得分:1)
fetch_object()方法将返回stdClass的实例。但是,如果指定了类名,它将返回该类的实例,并根据返回的数据填充属性。您不需要在类中指定所有列,除非您想要更改其可见性(即受保护或私有)。否则他们将默认公开。
另外,最好在要实例化的类中使用静态方法来整齐地分离关注点。参见:
class Class_Name
{
public static function customQuery($query)
{
$return = array();
if ($result = $mysqli->query($query)) {
// not passing a class name to fetch_object()
// will return an instance of stdClass
while ($obj = $result->fetch_object('Class_Name')) {
// add the fetched object (as an instance of the
// 'Class_Name' class in this case) to the return array.
$return[] = $result;
}
return $return;
}
// return false if no results found
return false;
}
}
这样调用静态方法,你将获得一个'Class_Name'对象数组:
$results = Class_Name::customQuery($query);
如果您只查询1个结果,则上述内容如下:
class Class_Name
{
public static function customQuery($query)
{
$return = array();
if ($result = $mysqli->query($query)) {
return $result->fetch_object('Class_name');
}
// return false if no results found
return false;
}
}
通过这个,您将获得一个'Class_Name'对象。
注意,如果您使用的是命名空间类,则应用完全限定的命名空间类名。
答案 3 :(得分:0)
您对结果使用fetch_object。你做while ($obj = $result->fetch_query()) { ... }
function customQuery($query) {
if ($result = $mysqli->query($query)) {
while ($obj = $result->fetch_object()) {
# do stuff.
}
} else {
# raise some error, query did not make it.
}
}
如果指定param
,则这是一个将被实例化以处理结果的类。
# $result->fetch_object('MyClass');
MyClass {
private $id;
public function __construct($id/* fields */) {
$this->id = $id; # say `id` is the only field
}
}
答案 4 :(得分:0)
以下是使用它的正确方法:
<?php
$res = $mysqli->query($q);
while($params = $res->fetch_assoc()):
endwhile;
$res->free();
$res = $mysqli->query($q);
while ($obj = $res->fetch_object('ClassName', array($params)):
$obj_list[] = $obj;
endwhile;
?>
mysqli::fetch_object()
不会将字段名称和值发送给构造函数,它只是创建一个具有属性的对象,而不会通过setter。如果要通过构造函数,必须首先恢复结果并将其以参数形式提供给他。
如果您想通过构造函数,那么会发生什么?首先,fetch_object()
将创建属性,然后它将覆盖构造函数传递它们。