为了账号安全,请及时绑定邮箱和手机立即绑定

具有 class_name 参数值的 fetch_object

具有 class_name 参数值的 fetch_object

PHP
慕运维8079593 2022-11-12 13:52:49
我有一个项目(目录)test。xampp/htdocs在这个项目中,我有 2 个 php 文件(Account.php 和 Test.php)。//---Account.php---<?phpclass 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---<?phprequire_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
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

正如手册所说:

请注意,mysqli_fetch_object()在调用对象构造函数之前设置对象的属性。

但是从同一本手册中您可以看到还有第三个参数

要传递给 class_name 对象的构造函数的可选参数数组。

所以,你应该这样做:

$obj = $result->fetch_object("Account", ['email', 'pass', 'id']);

如果这没有帮助,您应该将所有构造函数参数设为可选:

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

因为fetch_object已经设置了这些道具。这也意味着您应该检查这些参数是否为空。

或者不使用fetch_object其他东西,只显式调用构造函数,但这显然是您想要使用的最后一个解决方案。


查看完整回答
反对 回复 2022-11-12
  • 1 回答
  • 0 关注
  • 64 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信