Php 函数依赖性

Php 函数依赖性,php,mysql,class,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中,我试图在数据库类中获取一个公共变量,该变量在创建类时连接到数据库。像这样-

<?php

class database {    

    public $_link;


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


}

链接
实际上是
数据库
的属性,而不是
用户
的属性。因此,请使用:

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

您只是缺少了前面的
$this->db->

$query =  $this->db->_link->prepare("SELECT `user_id` FROM `users` WHERE `username` = :user");
现在,它应该起作用了;您正试图直接访问它。首先通过
$this->db
访问数据库链接保持对象,然后才访问属性
$\u链接

如果因为对象较短而需要
$\u link
作为变量,请将对象
$this->db->\u link
指定给
$\u link

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

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

在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){

    }

}

最好反转依赖项并包装$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) {

    }

}
用法


现在,您可以在类外配置db连接。

$this->db->\u link->prepare()。您应该通过数据库类的实例调用db函数。您需要使用$this->db->u link来获取pdo对象,而不是$link。尝试了一下,但是我得到了“致命错误:调用/home/swinkdc/public_html/studentreach/core/authentication/user.php中未定义的方法database::prepare(),第18行”没有理由包装PDO@sectus到处都有一些用例,比如您需要的一些附加方法。例如,您可以编写
$class->select([“field”],“table”,“id=$a”)。哪个比较短。(即使我不喜欢…)谢谢你,好先生!由于我习惯了程序化编程,所以仍然在尝试在PHP中使用OOP。非常感谢。将在5分钟内滴答作响
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", "")));