PHP-MySQLi OOP usage of fetch_object([ string $class_name =


PHP-MySQLi OOP usage of fetch_object([ string $class_name = "stdClass" [, array $params ]])

在过去的几天里,我一直在试图掌握mysqli_result::fetch_object()

我要做的是实例化一个基于预先编写的类的对象数组,该类包含我需要的操作方法。很简单吗?当然,直到我尝试将构造函数参数传递给每个对象。

现在,在单个实例中将参数传递给类的构造函数可以正常工作,如下所示:

<?php
 class classA {
  private $dbo;
  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }
  public function createObject() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` = 'value';");
   return $stmt->fetch_object('classB', array("A Parameter!"));
  }
 }
 class classB {
  private $param;
  function __construct($param) {
   $this->param = $param;
  }
  public function getParam() {
   return $this->param;
  }
 }
 $classA = new classA();
 echo $classA->createObject()->getParam(); //Returns "A Parameter!"
?>

但是,如果我要在结果集合上尝试此操作,则相同的参数将返回"或null,如下面的示例所示:

<?php
 class classA {
  private $dbo;
  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }
  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();
   foreach($stmt as $result) {
    $myObjects[] = $result->fetch_object("classB", array("A Parameter!"));
   }
   return $myObjects;
  }
 }
 class classB {
  private $param;
  function __construct($param) {
   $this->param = $param;
  }
  public function getParam() {
   return $this->param;
  }
 }
 $classA = new classA();
 $i = 0;
 foreach($classA->createObjects() as $anObject) {
  echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns nothing?
  $i ++;
 }
?>

至少在我的机器上是这样的。

现在是问题:这是一个实际的问题与mysqli_result::fetch_object()还是它的设计?

是否有一种方法可以达到类似的预期结果?

基本上我已经写了一系列的类,现在依赖于这个"错误",我有其他的方法来解决它,但它们不太可取,我宁愿接受挑战,学习一些东西。

感谢您的宝贵时间。

更新:很有可能我的循环写错了,因为我刚刚测试了:

<?php
 class classA {
  private $dbo;
  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }
  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();
   if($result = $this->dbo->query("SELECT `column` FROM `table`;")) {
    while($row = $result->fetch_object("classB", array("A Parameter!"))) {
     $myObjects[] = $row;
    }
   }
   return $myObjects;
  }
 }
?>

似乎我得到了一个结果,我将在明天进行更深入的测试

原来我只是个笨蛋,前面提到的循环是不正确的。

下面是完整的工作示例:

<?php
 class classA {
  private $dbo;
  function __construct() {
   $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306);
  }
  public function createObjects() {
   $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';");
   $myObjects = array();
   if($result = $this->dbo->query("SELECT `column` FROM `table`;")) {
    while($row = $result->fetch_object("classB", array("A Parameter!"))) {
     $myObjects[] = $row;
    }
   }
   return $myObjects;
  }
 }
 class classB {
  private $param;
  function __construct($param) {
   $this->param = $param;
  }
  public function getParam() {
   return $this->param;
  }
 }
 $classA = new classA();
 $i = 0;
 foreach($classA->createObjects() as $anObject) {
  echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns "object[x]:'A Parameter!'<br />"
  $i ++;
 }
?>

再次感谢您的宝贵时间。