无法调用类构造函数

时间:2015-04-20 20:15:06

标签: php database pdo constructor namespaces

我一直在忙着创建自己的框架(在这方面变得更有经验),偶然发现了一个我无法通过搜索谷歌来解决的错误...哇...

我想从数据库中获取数据,放在对象/类中。我之前已经用我在学校学到的不同方式完成了这项工作,但我想调整它并使其更具动态性,以便我可以在我的框架中使用它。

我偶然发现的问题如下:

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类构造函数匹配。

3 个答案:

答案 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