php fetch_object继承

时间:2014-03-26 18:46:51

标签: php mysql inheritance

我上课了:

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;

这段代码不起作用,但是有办法做到这一点吗?

1 个答案:

答案 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中提供的别名)与类属性名称完全匹配(无需在类构造函数中进行映射)。