PDO::FETCH_CLASS报类未找到但直接实例化类正常的问题求解
问题原因
PHP的use关键字属于编译时语法,仅对当前文件中直接书写的类名(比如new Product()这类语法)生效,不会解析运行时动态传入的字符串类名。
你在ProductsManager中传入给fetchAll的是字符串'Product',PDO会默认在当前ProductsManager所属的命名空间Tristan\TableauDynamique\Model下查找Product类,自然找不到对应类。而你直接new Product()时,编译阶段就会自动匹配use导入的完整类名,所以可以正常使用。
解决方法
直接使用类的::class常量传参即可,这个常量会自动返回带完整命名空间的类名字符串。
将你ProductsManager中的代码:
$products = $query->fetchAll(\PDO::FETCH_CLASS, 'Product');
修改为:
$products = $query->fetchAll(\PDO::FETCH_CLASS, Product::class);
额外注意
你当前Product类里的name、address、city属性定义的类型是int,从数据库字段含义来看这几个应该是字符串类型,后续fetch赋值时可能会出现类型转换错误,建议修改为string类型。
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

