首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用新方法扩展PDO类,并在另一个类中使用该方法?

如何用新方法扩展PDO类,并在另一个类中使用该方法?
EN

Stack Overflow用户
提问于 2019-02-06 00:40:16
回答 1查看 566关注 0票数 0

我曾经将我的数据库连接放在一个文件中,并将它包含在我需要的页面中。在这个文件中,我还用一个新方法run()扩展了PDO类,它允许我编写简写的PDO查询,并且工作得很好:

代码语言:javascript
复制
class MyPDO extends PDO {
    public function run($sql, $bind = NULL) {
        $stmt = $this->prepare($sql);
        $stmt->execute($bind);
        return $stmt;
    }
}

$conn = new MyPDO("mysql:charset=utf8;host=$host;dbname=$name", $user, $pass);

我现在正试图通过使用类来整理我的文件和它们中的代码。因此,这个数据库连接文件变成了两个类:

代码语言:javascript
复制
class MyPDO extends PDO {

    public function run($sql, $bind = NULL) {
        $stmt = $this->prepare($sql);
        $stmt->execute($bind);
        return $stmt;
    }

}

class Connection {

    private $_config = NULL;
    public $conn = NULL;
    public $error = NULL;

    public function __construct(array $config) {
        $this->_config = $config;
        $this->getPDOConnection();
    }

    private function getPDOConnection() {
        if ($this->conn == NULL) {
            $this->conn = new MyPDO("mysql:charset=utf8; host=".$this->_config['host']."; dbname=".$this->_config['name']."", $this->_config['user'], $this->_config['pass']);
            [...]
        }
    }

    [...]
}

此时,我没有使用autoload函数来加载类。这个特定的文件只需要两个类,所以我需要手动处理它们。我还认为手动包含连接类允许用MyPDO扩展PDO类。

代码语言:javascript
复制
require API_ROOT . 'core/database/connection.class.php';
require API_ROOT . 'core/users/user.class.php';

我已经测试过这个连接,它确实已经连接到了。

我遇到的问题是,在另一个类中使用名为MyPDO的新run()方法,在本例中是user.class

在user.class内部,我只是试图对用户进行身份验证,因此需要使用run()方法。

我像这样调用用户类:

代码语言:javascript
复制
$db = new Connection($config['database']);
$user = new User($db, $config);

在user.class内部,我希望使用run(),并通过调用$this->db->run来实现

代码语言:javascript
复制
class User {

    private $db = NULL;
    private $config = NULL;

    public function __construct($db = NULL, $config = NULL) {
        $this->db = $db;
        $this->config = $config;
    }

    public function login($email = '', $password = '', $remember_me = '') {
        $user_profile = $this->db->run("     <--------------
            [...]
        ", [$email])->fetch(PDO::FETCH_ASSOC);
    }

}

但是,当我运行以下命令时,会收到以下错误:

未定义的错误:调用未定义的方法连接::run()

我理解这个错误的含义,在我的连接类中没有一个叫做run()的方法,但是为什么它认为这个方法在那里呢?我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-06 06:07:07

@Quasimodo的克隆是正确的,您需要从conn变量中获取它,就像他们演示的那样。如果它不起作用,您在其他地方的实现上做错了什么,因为run()conn的一种方法,因为conn是定义run()方法的类MyPDO

$this->db等于类Connection,它在__construct()中创建MyPDO实例,并在getPDOConnection()方法中将其分配给$this->conn -因此,$this->db->conn->run()是您要寻找的对象。

您的getPDOConnection()可能应该重命名为setPDOConnection(),然后让getPDOConnection()检索$this->conn

代码语言:javascript
复制
public function getPDOConnection()
{
    return $this->conn;
}

然后,您的用户类将实际使用:

代码语言:javascript
复制
$this->db->getPDOConnection()->run(...etc);

这样会让事情变得更清楚一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54545162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档