未能引用类__construct()中设置的PDO实例

时间:2014-01-03 06:17:56

标签: php pdo constructor

在类本身中,我似乎无法引用__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内容有效?

1 个答案:

答案 0 :(得分:2)

实例化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方法时的微小但微妙的变化。