【问题标题】:Could not call class constructor无法调用类构造函数
【发布时间】:2015-06-27 17:56:56
【问题描述】:

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

我想从数据库中获取数据,放在一个对象/类中。我以前做过,以我在学校学习的不同方式,但我想对其进行调整并使其更具动态性,以便我可以在我的框架中使用它。

我偶然发现的问题如下:

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的构造函数...

我已经测试了我的数据库类/连接是否有效,所以这不是问题。

我的表结构与我的 Campers 类构造函数相匹配。

【问题讨论】:

    标签: php database pdo constructor namespaces


    【解决方案1】:

    我在至少 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;
    

    案例3:

    您在类中的字段未初始化

    class Example {
      public string $name;
    }
    
    SELECT name FROM tableX;
    

    可以通过初始化字段来解决

    class Example {
      public string $name = '';
    }
    

    或者使用构造函数来声明它

    BR

    【讨论】:

      【解决方案2】:

      这个错误不仅仅意味着无法调用构造函数,它还用于指示调用它时发生了错误。

      在我的例子中,在构造函数中抛出了一个异常。如果你不打印/记录堆栈跟踪,你很容易错过它。

      享受吧! :)

      【讨论】:

        【解决方案3】:

        来自PSR-4 spec

        终止类名对应于以 .php 结尾的文件名。文件名必须与终止类名的大小写匹配。

        无论如何,您可能无法按原样实例化 Camper 类。 PSR-4 期望你的文件名与类匹配。它应该位于framework/Campers/Camper.php

        【讨论】:

        • 好的,所以如果我(反过来)会从命名空间中移除框架(这实际上有点过度使用),它应该可以工作吗?现在尝试编辑:尝试过,仍然是同样的错误:\
        • 您最初的问题是您的类与其包含的文件之间的命名冲突。如果您仍然遇到同样的错误,请确保您将完全限定的类名传递给 ->execute(...) 调用。如果您仍然遇到问题,提供更清晰的目录结构图片和composer.jsonpsr4 部分会很有帮助。
        • 我还建议不要使用从答案中获得的修复来更新您的原始问题。而是将更新附加到您的问题中,以明确您解决问题所经历的过程。
        猜你喜欢
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 2022-12-05
        • 2021-02-12
        • 1970-01-01
        • 2023-01-27
        • 2016-07-19
        • 2016-05-31
        相关资源
        最近更新 更多