我试图在我的类“用户”中创建一个“用户”对象,基于我存储在我的数据库中的属性,我使用PDO连接到。
我在Google上搜索了一些页面,发现大多数人都使用fetchObject方法。现在,我正在尝试使用它来创建当前类的对象,但我不断收到错误:
致命错误:未捕获的ArgumentCountError:函数User :: __ construct()的参数太少,0传递,而且预期正好...
每个人都在网上使用这个,但我似乎无法找到他们的构造函数,因为它们可能没有任何属性可以接收。
我目前的代码是这样的:
public static function createUserBySQL($id)
{
$stmt = BD::getConnection()->prepare("SELECT * FROM user WHERE username = ?");
$stmt->execute([$id]);
$user = $stmt->fetchObject(__CLASS__);
var_dump($user);
return $user;
}
这可能很容易解决,但这是我第一次使用PDO在PHP中进行OOP,所以我还不知道所有的解决方法和技巧很容易;)
谢谢, mikeysantana
快速编辑:“用户”实例的所有属性都是私有的,我希望保持代码逻辑。
您需要使构造函数的参数可选。 documentation说:
获取对象时,将从各自的列值分配其属性,然后调用其构造函数。
调用构造函数时,不提供任何参数,这就是您收到该错误的原因。
构造函数需要检查是否显式提供了参数,并且只在它们出现时填充属性。在上述文档的评论部分中有一些如何执行此操作的示例。
谢谢大家的帮助。
为了帮助未来读者解决这个问题,这是我的解决方案:
我保持上面的方法“createUserBySQL”,我只更改了我的构造函数。
构造函数现在在签名可选中具有所有属性,如下所示:
function __construct($name = null, $surname = null ...)
在构造函数内部,我做了一个验证,看看是否所有参数都为null。由于我有11个,为所有人做一个if语句会非常烦人,所以我使用了func_get_args()方法返回一个数组,其中所有参数都传递给构造函数。
最终的构造函数看起来像这样:
function __construct($firstname = null, $surname = null, ...)
{
if (func_get_args() != null){
$this->firstname = $firstname;
$this->surname = $surname;
...
}
}