【问题标题】:Using mysqli_result::fetch_object with my own class doesn't works在我自己的类中使用 mysqli_result::fetch_object 不起作用
【发布时间】:2018-04-11 14:39:18
【问题描述】:

我会尝试使用 fetch_object('Classname') 来测试这个方法。

Inserent.php 中的类 Inserent:

namespace classes\model;

 class Inserent{
    private $nummer;
    private $nickname;
    private $email;

    public function __construct ($nummer, $nickname, $email){
        $this->nummer = $nummer;
        $this->nickname = $nickname;
        $this->email = $email;
    }

    public function getNummer(){
        return $this->nummer;
    }

    public function setNummer($nummer){
        $this->nummer = $nummer;
    }
 ...
 }

在一个Mapper-Class InserentDAO.php中使用:

namespace classes\mapper;
use classes\model\Inserent;

class InserentDAO{
    private $dbConnect;

    public function __construct (){
        $this->dbConnect = MySQLDatabase::getInstance();
    }

    public function readAll(){
        $sql = "SELECT inserentennummer, nickname, email FROM inserent";
        $inserent = null;
        $inserentList = array();

        if ($result = $this->dbConnect->query($sql)) {

            while ($inserent = $result->fetch_object('classes\model\Inserent')) {
                $inserentList[] = $inserent;
            }
            $result->close();
        }
        return $inserentList;
    }
...
}

我收到错误,我的对象是空的:

警告:classes\model\Inserent::__construct() 缺少参数 1 在 D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 10 行

警告:classes\model\Inserent::__construct() 缺少参数 2 在 D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 10 行

警告:缺少 classes\model\Inserent::__construct() 的参数 3 在 D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 10 行

注意:未定义变量:nummer in D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 11 行

注意:未定义变量:昵称 D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 12 行

注意:未定义的变量:电子邮件 D:\xampp\htdocs\workspace\secondStep\classes\model\Inserent.php 上 第 13 行

但如果我在 Mapper 中更改代码,它会起作用。

部分代码改为 InserentDAO.php:

while ($obj = $result->fetch_object()) {
     $inserent = new Inserent($obj->inserentennummer, $obj->nickname, $obj->email);
     $inserentList[] = $inserent;
}

【问题讨论】:

  • 哪一行是什么?
  • 您查看手册了吗?您需要阅读一些 cmets 和文本。

标签: php oop mysqli namespaces


【解决方案1】:

我相信fetch_object 调用一个空的构造函数,然后根据它获取的结果列设置属性。 There is a comment on the manual confirming that.

这就是fetch_object("classes\model\Inserent") 正在做的事情:

$object = new classes\model\Inserent();
$object->inserentennummer = $result['inserentennumer'];
$object->nickname = $result['nickname'];
$object->email = $result['email'];
return $object;

这就是为什么它抱怨缺少参数和未定义的变量(它们是private)。

显而易见的解决方案是重构你的类以提供一个空的构造函数和公共属性:

namespace classes\model;

class Inserent{
    public $nummer;
    public $nickname;
    public $email;

    public function __construct ($nummer = 0, $nickname = "", $email = ""){
        //...

将属性公开的另一种方法是使用 __set 魔术方法,但您仍然必须提供零参数构造函数。

【讨论】:

    【解决方案2】:

    谢谢你的回答!!

    我必须按照您解释的方式更改我的 Class Inserenten.php 中的构造函数。此外,我必须将属性名称从“$nummer”更改为“$inserentennummer”,因为数据库表属性具有此名称。我还必须向构造函数添加查询。

    __set() 方法没有帮助。

    class Inserent{
        private $inserentennummer;
        private $nickname;
        private $email;
    
    
        public function __construct ($inserentennummer = 0, $nickname = "", $email = ""){
            if(!$this->inserentennummer){
                $this->inserentennummer  = $inserentennummer;
            }
    
            if(!$this->nickname){
                $this->nickname  = $nickname;
            }
    
            if(!$this->email){
                $this->email  = $email;
            }       
        }
    

    然后它开始工作了:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2014-01-18
      相关资源
      最近更新 更多