这可能不是一个真正的问题,但我想知道为什么会这样。
代码的工作方式与我在此处发布的方式相同。
我有一个像这样的Database()类:
class Database extends PDO
{
public function __construct()
{
$options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING);
parent::__construct(DB_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8', DB_USER, DB_PASS, $options);
}
}
通过Controller调用此类:
class Controller
{
function __construct()
{
Session::init();
if (!isset($_SESSION['user_logged_in']) && isset($_COOKIE['rememberme'])) {
header('location: ' . URL . 'login/loginWithCookie');
}
try {
$this->db = new Database();
} catch (PDOException $e) {
die('Database connection could not be established.');
}
$this->view = new View();
}
}
注意这里调用了Database()类。
现在,我有一个"模型",需要数据库连接与数据库通信:
class Notes extends Controller
{
public function __construct()
{
parent::__construct();
}
public static function getSumNotes()
{
$sql = "SELECT COUNT(*) FROM table WHERE user_id = :user_id";
$query = new Database();
$query = $query->prepare($sql);
$query->execute(array(':user_id' => $_SESSION['user_id']));
return $query->fetchColumn();
}
}
令我恼火的是:方法Notes :: getSumNotes()调用另一个新的Database()类,它是从表中获取值所必需的。没有这个,连接将无法正常工作。
问题:为什么我必须两次调用Database()类,尽管来自Notes的parent :: __ construct()从" dads"获取相同的变量和构造函数。 (控制器)课程?
希望得到启发。
感谢。
答案 0 :(得分:0)
您不必两次调用数据库对象
请注意,您的getSumNotes()
方法为static
,因此您无法在方法内调用$this
(这会引发E_STRICT错误,因此请检查您的日志)。
从您的方法中删除static
或使用此解决方法:
class Notes extends Controller
{
// Notice the new variable has to be static as well
public static $staticDb;
public function __construct()
{
parent::__construct();
// Make sure the db variable exists in your parent class
self::$staticDb = $this ->db;
}
public static function getSumNotes()
{
$sql = "SELECT COUNT(*) FROM table WHERE user_id = :user_id";
// Use the same DB connection
$query = self::$staticDb;
$query = $query->prepare($sql);
$query->execute(array(':user_id' => $_SESSION['user_id']));
return $query->fetchColumn();
}
}
另一方面,您的MVC结构存在问题。模型不应该是控制器类的扩展 有关here的更多内容,如果您愿意的话。