我一直在忙着创建自己的框架(在这方面变得更有经验),偶然发现了一个我无法通过搜索谷歌来解决的错误...哇...
我想从数据库中获取数据,放在对象/类中。我之前已经用我在学校学到的不同方式完成了这项工作,但我想调整它并使其更具动态性,以便我可以在我的框架中使用它。
我偶然发现的问题如下:
SQLSTATE[HY000]: General error: could not call class constructor on line 96
这是我的数据库类中的函数:
public function getObject($query, $classRootPath)
{
try {
//Check if slashes are double already and make them if not
if(!strpos($classRootPath, "\\\\")) {
$classRootPath = str_replace("\\","\\\\",$classRootPath);
}
$statement = $this->pdo->prepare($query);
$statement->execute(\PDO::FETCH_CLASS, "Campers\\Camper"); // I want this path to be $classRootPath once it is working with this dummy data
return $statement->fetchAll();
// return $this->pdo->query($query)->fetchAll(\PDO::FETCH_CLASS, "Campers\\Camper");
} catch (\PDOException $e) {
throw new \Exception("DB receive object failed: " . $e->getMessage());
}
}
此功能嵌套在Database
中,该类名为Database
/ Database.php
以下类嵌套在Campers
中,称为Camper.php
class Camper {
public $ID, $date, $camperID;
public function __construct($ID, $date, $camperID)
{
$this->ID = $ID;
$this->date = $date;
$this->camperID = $camperID;
}
}
我能想到这个问题的唯一原因是,"Campers\\Camper"
是在Database
之上调用,但是我不知道如何逃避这一点。我尝试了..\
,但我收到了错误,这是我能得到的最接近的错误。在这里它可以找到类,但它找不到Camper
...
我已经测试过我的db类/连接是否正常工作,所以这不是错误。
我的表的结构与我的Campers
类构造函数匹配。
答案 0 :(得分:1)
来自PSR-4 spec:
终止类名对应于以.php结尾的文件名。文件名必须与终止类名称的大小写匹配。
无论如何,您可能无法实例化Camper
类。 PSR-4希望您的文件名与班级相匹配。它应位于framework/Campers/Camper.php
。
答案 1 :(得分:0)
此错误意味着无法调用构造函数,它还用于指示调用时发生的错误。
就我而言,de构造函数中抛出了异常。如果你不打印/记录堆栈跟踪,你很容易错过它。
享受! :)
答案 2 :(得分:0)
我在至少3个案例中有同样的问题。
情况1:您从数据库中选择了可以包含NULL值的内容。
SELECT name FROM tableX;
在这种情况下,我以这种方式进行选择:
SELECT IFNULL(name,'') AS name FROM tableX;
其中name是您班上的一个字段。
情况2:您选择的不是课堂上的字段
class Example {
public string $name = '';
}
然后以下查询将失败,因为您的课程中未声明ID
SELECT id, name FROM tableX;
case3:
您在课堂上的字段未初始化
class Example {
public string $name;
}
SELECT name FROM tableX;
可以通过初始化字段来解决
class Example {
public string $name = '';
}
或使用构造函数进行声明
BR