具有 class_name 参数值的 fetch_object

我有一个项目(目录)test。xampp/htdocs


在这个项目中,我有 2 个 php 文件(Account.php 和 Test.php)。


//---Account.php---


<?php


class Account{


    protected int $id;

    protected string $email;

    protected string $pass;


    function __construct(string $email, string $pass, int $id = 0) {


        $this->id = $id;

        $this->email = $email;

        $this->pass = $pass;


    }


}



//---Test.php---


<?php


require_once("Account.php");


class Test{


    public function index(){


        $hostname="localhost";

        $database="mydb";

        $username="root";

        $password="";


        $mysqli = new mysqli($hostname, $username, $password, $database);

        $result = $mysqli->query("SELECT * FROM accounts WHERE email = 'my@email.com';");


        if($result) {


            $obj = $result->fetch_object("Account"); //ArgumentCountError


            if ($obj instanceof Account) {


                printf($obj->email);


            }


        }


    }


}


(new Test())->index();

我在浏览器中通过:运行它http://localhost/test/test.php,我得到一个错误。


Fatal error: 

    Uncaught ArgumentCountError: Too few arguments to function Account::__construct(), 

    0 passed and at least 2 expected in C:\xampp\htdocs\test\Account.php:9 


Stack trace: 

    #0 [internal function]: Account->__construct() 

    #1 C:\xampp\htdocs\test\Test.php(19): mysqli_result->fetch_object('Account') 

    #2 C:\xampp\htdocs\test\Test.php(33): Test->index() 

    #3 {main} thrown in C:\xampp\htdocs\test\Account.php on line 9

如果我从中删除参数fetch_object("Account") -> fetch_object(),则不再有错误并且可以工作。但我想将它与参数一起使用。


为什么使用参数会产生错误以及如何解决?


我的 PHP 版本是 7.4


慕运维8079593
浏览 69回答 1
1回答

慕丝7291255

正如手册所说:请注意,mysqli_fetch_object()在调用对象构造函数之前设置对象的属性。但是从同一本手册中您可以看到还有第三个参数:要传递给 class_name 对象的构造函数的可选参数数组。所以,你应该这样做:$obj&nbsp;=&nbsp;$result->fetch_object("Account",&nbsp;['email',&nbsp;'pass',&nbsp;'id']);如果这没有帮助,您应该将所有构造函数参数设为可选:function&nbsp;__construct(string&nbsp;$email&nbsp;=&nbsp;'',&nbsp;string&nbsp;$pass&nbsp;=&nbsp;'',&nbsp;int&nbsp;$id&nbsp;=&nbsp;0)因为fetch_object已经设置了这些道具。这也意味着您应该检查这些参数是否为空。或者不使用fetch_object其他东西,只显式调用构造函数,但这显然是您想要使用的最后一个解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP