为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
千万里不及你 2021-10-22 10:18:10
我有数据库连接问题。好吧,我在初始化 PDO 连接的地方包含 db.php 文件,然后我检查是否设置了 $err 变量,如果没有,我创建一个新对象并尝试使用一种为我构建链接 ID 的方法。但问题是——这个类中的方法根本看不到 $pdo 对象。索引.phprequire_once 'db.php';if (!isset($err)) {             $linkBuilder = new LinkBuilder();    $link = $linkBuilder->buildLink();    // ...}LinkBuilder.class.php<?phpclass 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;    }}而且,是否有任何更改可以使此代码更好?
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

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


    // ...

}


查看完整回答
反对 回复 2021-10-22
  • 1 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信