我上课了:
class item{
public id='';
public name='';
}
在这个类中我希望有一个函数用mysql查询中的值填充类 像这样:
$result_item = $this->mysqli->query("SELECT *
FROM items
WHERE item_id=".$item_id."
LIMIT 1");
$res = $result_item->fetch_object(SalesOrderItem);
$this = $res;
这段代码不起作用,但是有办法做到这一点吗?
答案 0 :(得分:1)
您需要查看mysqli :: fetch_object周围的文档。
您的类名需要指定为字符串,如下所示:
$result_item->fetch_object('SalesOrderItem'); // or 'item' your question is inconsistent here
您还可能需要将一些值传递给构造函数以帮助您。我强烈建议您阅读文档页面上的用户说明 - http://us3.php.net/manual/en/mysqli-result.fetch-object.php,以获得一些比主要文档本身更好的使用示例。
您在评论中提到的致命错误是因为您无法更改$this
。这是对当前对象实例的内部引用。试图改变它是没有意义的。
如果你的意图是你有一个对象类,实质上是它自己的对象关系映射器(ORM)。对于调用数据库的位置,从记录中填充属性并以某种方式将自身变异为另一个类,这实际上是不可能的。您可能需要做的是利用一种工厂模式来创建一个除了使用ORM方法实例化给定类型的类之外什么都不做的类。
所以也许用法就是这样:
// The class with MySQLi logic could be called something like MysqlObjectfactory
// It could take input like an instantiated mysqli object, DB table name,
// the class name you are trying to map to, and the id for the specific item in the class you are looking for
// it would use the logic noted above to generate an object with the specifications given
// and return it to the caller
$object = MysqliObjectFactory::getObject($mysqli, $db_table, $class_name, $id);
另一个让我想到的想法是:为什么重新发明轮子?听起来你正在寻找的是对象关系映射器。 PHP中有几个真正被广泛使用:Doctrine,Propel,PHP Active Record等。您可以查看这些内容,因为它们会比使用mysqli::fetch_object()
尝试执行此操作时提供更多功能/灵活性其中映射依赖于数据库字段(或SQL中提供的别名)与类属性名称完全匹配(无需在类构造函数中进行映射)。