无法引用类 __construct() 中设置的 PDO 实例



在类本身中,我似乎无法引用__construct()函数中设置的PDO实例。

法典

class Category {
    protected static $pdo;
    private function __construct() {
        try {
            self::$pdo = new PDO('mysql:host=localhost;dbname=database', $username, $password);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (PDOexception $e) {
            return $e->getMessage();
        }
    }
    // convert category slug to id
    public static function slug_to_id($category_slug) {
        $query = self::$pdo->prepare('SELECT id FROM `category` WHERE slug = :slug');
        $query->execute(array('slug' => $category_slug));
        $data = $query->fetch(PDO::FETCH_ASSOC);
        return $data['id'];
    }
}

$id = Category::slug_to_id($category_slug);
print_r($id);

错误

PHP Fatal error:  Call to a member function prepare() on a non-object

我怎样才能让__construct的东西发挥作用?

实例化PDO对象的方式是问题所在。你在构造函数中执行此操作,成功后应该返回类Category的实例,但你从不调用构造函数,因为你真的不需要它,因为你有所有的静态方法。
如果您坚持使用静态方法,一种可能性是实例化 PDO 对象,例如 init()方法。
类似的东西

class Category {
    protected static $pdo = null;
    private function init() {
        try {
            self::$pdo = new PDO('mysql:host=localhost;dbname=database', $username, $password);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        catch (PDOexception $e) {
            return $e->getMessage();
        }
        return true;
    }
    // convert category slug to id
    public static function slug_to_id($category_slug) {
        // check whether the object's been instantiated
        if (self::$pdo === null) {
            $res = self::init();
        }
        if (is_string($res)) { 
            // an exception has been thrown
            // do something with the message you've got in $res
        }
        $query = self::$pdo->prepare('SELECT id FROM `category` WHERE slug = :slug');
        $query->execute(array(':slug' => $category_slug));
        $data = $query->fetch(PDO::FETCH_ASSOC);
        return $data['id'];
    }
}

另外,请参阅最后调用 execute 方法的方式的微小但微妙的变化。

最新更新