PHP-MySQLi使用fetch_object的OOP([string $ class_name =" stdClass" [,array $ params]])

时间:2015-05-28 04:26:43

标签: php oop mysqli

在过去的几天里,我一直在用一块坚硬的墙撞击我的头,想要掌握 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!"
?>

但是,如果我在一组结果上尝试这个,那么相同的参数将返回&#39;&#39;或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()的实际问题还是设计?

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

基本上我已经编写了一系列课程,现在这些课程都依赖于这个&#34;错误&#34;我有其他方法,但它们不太可取,我宁愿受到挑战并学到一些东西。

感谢您的时间。

更新 很可能我的循环写得不正确,因为我刚刚测试过:

<?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;
  }

 }

?>

看来我得到了一个结果,明天我将对此进行更深入的测试。

1 个答案:

答案 0 :(得分:0)

好的事实证明我只是一个笨蛋,上面提到的循环不正确。

以下是完整的工作示例:

<?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 ++;
 }
?>

再次感谢您的时间。