【问题标题】:PHP OOP - $pdo variable does not exist in function of the classPHP OOP - 类的函数中不存在 $pdo 变量
【发布时间】:2019-07-20 11:38:07
【问题描述】:

我的数据库连接有问题。

好吧,我在其中包含初始化 PDO 连接的 db.php 文件,然后检查是否设置了 $err 变量,如果没有设置,我创建一个新对象并尝试使用一种方法为我。但问题是——这个类中的方法根本看不到 $pdo 对象。

index.php

require_once 'db.php';
if (!isset($err)) {         
    $linkBuilder = new LinkBuilder();
    $link = $linkBuilder->buildLink();

    // ...
}

LinkBuilder.class.php

<?php

class LinkBuilder {

    private $newLink;

    private function linkInUse($link) {
        try {
            $stmt = $pdo->prepare('SELECT * FROM table WHERE link = :link');
            $stmt->bindValue(':link', $link);
            $stmt->execute();

            if ($stmt->rowCount() > 0) return true;
        } catch (PDOException $e) {
            $err = Constants::DB_ERR;
        }       
    }

    public function buildLink() : string {
        do {
            $this->newLink = rand(100, 999) . chr(rand(65, 90)) . chr(rand(65, 90)) . chr(rand(65, 90));
        } while ($this->linkInUse($this->newLink));

        return $this->newLink;
    }


}

另外,有什么地方可以改变以使这段代码更好吗?

感谢安万斯!

【问题讨论】:

    标签: php scope


    【解决方案1】:

    您必须将 PDO 对象传递到您的类中。在现代框架中,这将通过依赖注入来完成。在您的情况下,您可以从将构造函数添加到链接构建器类开始。

    class LinkBuilder {
    
        private $pdo;
        private $newLink;
    
        public function __construct(\PDO $pdo)
        {
            $this->pdo = $pdo;
        }
    
        private function linkInUse($link) {
            try {
                $stmt = $this->pdo->prepare('SELECT * FROM table WHERE link = :link');
    …
    
    

    您必须将对象的初始化更改为

    require_once 'db.php';
    if (!isset($err)) {
        $linkBuilder = new LinkBuilder($pdo);
        $link = $linkBuilder->buildLink();
    
        // ...
    }
    

    【讨论】:

    • 谢谢!这个反斜杠在构造函数参数中意味着什么?
    • @mystickGuy 命名空间原因。您需要阅读有关 OOP、命名空间、...的更多信息。 \Foo\Bar\Baz !== \Baz
    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多