函数依赖PHP

时间:2013-05-14 15:21:26

标签: php mysql class

所以在php中我试图在数据库类中获取一个公共变量,该类在创建类时连接到数据库。像这样 -

<?php

class database {    

    public $_link;


    public function __construct (){
       $this->_link = new PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "");
    }


}

和...

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

如果我在用户中扩展数据库,我可以明显地引用_link,如果我将其设为私有并且它将起作用,但是,我不认为我应该继承只是因为得到类似的东西..

每当我尝试关于我得到:     致命错误:在第18行的/home/swinkidc/public_html/studentreach/core/authentication/user.php中调用非对象的成员函数prepare()

如上所述,如果我尝试继承方式它会起作用,我只是觉得这不是一个很好的方法来做这样的事情。

有什么建议吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

link实际上是database的属性,而不是user的属性。因此使用:

$query =  $this->db->_link->...

答案 1 :(得分:0)

您之前错过了$this->db->

$query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");

现在,它应该工作;你正试图直接访问它。首先通过$this->db访问数据库链接保留对象,然后才访问属性$_link

如果您需要$_link作为变量,因为它更短,请将对象$this->db->_link指定给$_link

$_link = $this->db->_link;

在你的getUserID函数的开头,它也会起作用。

答案 2 :(得分:0)

在User类中尝试以下内容:

<?php

class user{

    private $db;


    public function __construct() {
        $this->db = new database;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user){
        $query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();       
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id']; 
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user){

    }

}

这可以用作_link 用户的属性,但是数据库,并且,如果扩展类数据库,它是可以从链接中的方法访问(至少在Java中,我不知道是否适用于PHP),但是如果你只是实例化它就不行。这只是基本的OOP。

祝你好运。

答案 3 :(得分:0)

最好反转依赖关系并包装$ db。

class database {

    private $_link;

    public function __construct(\PDO $pdo) {
        $this->_link = $pdo;
    }

    public function getLink() {
        return $this->_link;
    }

    //other useful stuff

}

class user {

    private $_db;

    public function __construct(\database $db) {
        $this->_db = $db;
    }

    public function getDB() {
        return $this->_db;
    }

    /**
     * Returns the ID of a user.
     * @param string $user
     * @return mixed
     */
    public function getUserID($user) {
        $query = $this->getDB()->getLink()->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
        $query->bindParam(":user", $user);
        $query->execute();
        $result = $query->fetch(PDO::FETCH_ASSOC);
        return $result['user_id'];
    }

    /**
     * Checks if given user is active.
     * @param string $user
     * @return bool Returns true/false if user is active.
     */
    public function isUserActive($user) {

    }

}

用法

$user = new \user(new \database(new \PDO("mysql:host=localhost; dbname=swinkidc_student", "swinkidc_student", "")));

现在,您可以在类之外配置数据库连接。