在我自己的类中使用mysqli_result :: fetch_object并不起作用

时间:2018-04-11 14:39:19

标签: php oop mysqli namespaces

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

Inserent.php中的Class 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;
    }
...
}

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

  

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

     

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

     

警告:类\ model \ Inserent :: __ construct()缺少参数3   在D:\ xampp \ htdocs \ workspace \ secondStep \ classes \ model \ Inserent.php on   第10行

     

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

     

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

     

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

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

代码InserentDAO.php的一部分:

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

2 个答案:

答案 0 :(得分: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魔术方法,但您仍然需要提供零参数构造函数。

答案 1 :(得分:0)

感谢您的回答!!

我必须按照你解释的方式更改我的Class Inserenten.php中的构造函数。此外,我不得不从" $ nummer"更改属性名称。 to" $ 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;
        }       
    }

然后它正在工作:-)