首页 > 解决方案 > 如何将 PDO::FETCH_CLASS 与命名空间一起使用?

问题描述

我正在学习 PHP,现在我正在展示一些带有 PDO 的文章。我在使用命名空间的 PDO::FETCH_CLASS 时遇到了一些问题。

我的文件夹架构:

class/
- Post.php
layout/
-articles/
--articles.php
public/
-index.php (contains my router)

Post.php

namespace App\Articles;

class Post {
    private $id;
    private $name;
    private $content;
    private $date;

    public function getId()
    {
        return $this->id;
    }
    public function getName()
    {
        return $this->name;
    }
    public function getContent()
    {
        return $this->content;
    }
    public function getExcerpt()
    {
        $res = $this->content;
        return (strlen($res) > 150) ? substr($res, 0, 150) . '...' : $res;
    }
    public function getDate()
    {
        return $this->date = date('d-m-Y', $this->date);
    }
}

data.db 仅包含四列:id、name(text)、content(text)、created_at(int)

我遇到问题的部分:

use App\Articles\Post;

$pdo = new PDO('sqlite:../data.db', null, null, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
]);
try {
    $query = $pdo->query('SELECT * FROM posts');
    $posts = $query->fetchAll(PDO::FETCH_CLASS, 'Post');
} catch (PDOException $e) {
    $error = $e->getMessage();
}

我尝试了不同的打字而不是'Post喜欢

'App\Articles\'
'App\Articles\Post'
'App\Articles\::POST'
...

我无法让它与 namepsace 一起使用。它与require '../class/Post.php'.

这个问题有解决方案还是我应该只使用 require ?

标签: phppdonamespaces

解决方案


PDO 不查找别名类名或解析当前命名空间。所以你必须明确地传递它:

$query = $pdo->prepare('SELECT * FROM posts');
$query->execute();
$posts = $query->fetchAll(PDO::FETCH_CLASS, __NAMESPACE__ . '\\post');

使用查询而不是prepare会导致pdo错误,我改为prepare。

如果它与类分开,则不能使用 NAMESPACE ,但可以使用 full path 'app\controller\post'

请参阅此答案和问题https://stackoverflow.com/a/20176944/12232340


推荐阅读