PHP OOP-该类的函数中不存在$ pdo变量

时间:2019-07-20 11:38:07

标签: php scope

我的数据库连接有问题。

好吧,我包含db.php文件,在该文件中初始化了PDO连接,然后检查是否设置了$ err变量,如果没有设置,我创建一个新对象,并尝试使用一种为该对象构建链接ID的方法。我。但是问题是-此类中的方法根本看不到$ 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;
    }


}

而且,是否有任何更改可以使此代码变得更好?

谢谢andvance!

1 个答案:

答案 0 :(得分:0)

您必须将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');
…

您必须将Object的初始化更改为

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

    // ...
}