在类本身中,我似乎无法引用__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
内容有效?
答案 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
方法时的微小但微妙的变化。