【问题标题】:Isntance of PDO given instead of namespace name - PSR4 Autoloading with composer给出 PDO 的实例而不是命名空间名称 - PSR 4 Autoloading with composer
【发布时间】:2016-02-17 04:11:52
【问题描述】:

我正在尝试学习如何使用 PDO。我有一个使用命名空间的非常小的应用程序。我使用 composer 来自动加载类。

我正在尝试遵循 PHPTheRightWay MVC 方法来处理 PDO,但我失败了。我已经设置了我的 DbModel 类以匹配他们的类,并在我的 php 代码中创建它的一个新实例并解析 PDO 对象。

类:

namespace Acme;

class DbModel {

    protected $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function getAllPlayers()
    {
        return $this->db->query('SELECT * FROM player');
    }
}

页面:

use Acme\DbModel;
use Acme\Player;
use Acme\Team;
use Acme\Match;

$db = new PDO('mysql:host=127.0.0.1;dbname=football', 'root', '');
$model = new DbModel($db);

但是,我收到以下错误。我不知道为什么会这样。

可捕获的致命错误:传递给 Acme\DbModel::__construct() 的参数 1 必须是 Acme\PDO 的实例,给定的 PDO 实例,在第 9 行的 C:\xampp\htdocs\footballMatch\matchDay.php 中调用并在第 9 行的 C:\xampp\htdocs\footballMatch\src\DbModel.php 中定义

添加此类后,我运行 composer installcomposer dump-autoload

【问题讨论】:

    标签: php mysql pdo composer-php psr-4


    【解决方案1】:

    将根命名空间前缀添加到 PDO 的任何使用位置,例如:

    public function __construct(\PDO $db)
    

    目前,您的脚本假定名为 PDO 的类应位于 Acme 命名空间下,但事实并非如此。

    【讨论】:

    • 或者,在命名空间行之后添加use PDO;。这会将类名称导入当前命名空间并使Acme\PDO 有效——因为use 指向\PDO
    猜你喜欢
    • 2015-09-22
    • 1970-01-01
    • 2014-11-12
    • 2016-01-22
    • 2014-09-24
    • 1970-01-01
    • 2023-04-02
    • 2013-08-03
    • 2014-03-17
    相关资源
    最近更新 更多