Explanation:调用parent :: __ construct,两个Database()类

时间:2014-06-16 23:31:01

标签: php class pdo constructor parent

这可能不是一个真正的问题,但我想知道为什么会这样。

代码的工作方式与我在此处发布的方式相同。

我有一个像这样的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"获取相同的变量和构造函数。 (控制器)课程?

希望得到启发。

感谢。

1 个答案:

答案 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的更多内容,如果您愿意的话。