所以在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()
如上所述,如果我尝试继承方式它会起作用,我只是觉得这不是一个很好的方法来做这样的事情。
有什么建议吗?
谢谢!
答案 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", "")));
现在,您可以在类之外配置数据库连接。