我有
class Check
{
public function __construct()
{
$this->db = new Database();
}
public function query()
{
$login = Session::get("login");
$sth = $this->db->prepare('SELECT admin FROM accounts WHERE login=:login');
$sth->execute(array(':login' => $login));
$result = $sth->fetch(PDO::FETCH_NUM);
return $result[0];
}
public static function admin()
{
echo self::query();
}
}
我在另一个有PDO连接的地方有数据库类。
class Database extends PDO
{
public function __construct()
{
parent::__construct('mysql:host=localhost;dbname=name','root','pass');
$this->query('SET NAMES utf8');
}
}
所以在Check :: admin()代码之后我得到错误:
未定义的属性:View :: $ db
为什么?
答案 0 :(得分:6)
您使用的static
方法想要使用instance
变量。
您的管理方法调用查询方法,查询方法使用db
实例变量。由于您的类未实例化,db
变量不存在。
我的建议是让管理方法不是静态的,并使用你的代码:
$mycheck = new Check();
$mycheck->admin();
或者,如果您使用的是PHP 5.4并希望坚持使用oneliner:
(new Check())->admin();
<强>更新强>
注意:不要在构造函数中创建db
类,而是将其注入:
public function __construct(Database $db)
{
$this->db = $db;
}
答案 1 :(得分:1)
很抱歉,这不是您问题的直接答案,但您的代码存在一些问题,因此需要花些时间检查并询问是否对您不清楚。
<?php
class Check {
protected $_db;
public function __construct(Database $db) {
$this->_db = $db;
}
public function query(ISession $sessionData) {
//WHY IS THE SESSION STATIC?
//$login = Session::get("login");
$sth = $this->_db->Connection()->prepare('SELECT admin FROM accounts WHERE login=:login');
$sth->execute(array(':login' => $sessionData->get("login")));
$result = $sth->fetch(PDO::FETCH_NUM);
return $result[0];
}
public function admin(ISession $sessionData) {
// REALLY BAD TO ECHO HERE
echo $this->query($sessionData);
}
}
class Database {
private $_name;
private $_password;
private $_connStr;
private $_settings;
private $_pdo;
public function __construct($connstr, $name, $password, array $settings = array()) {
$this->_name = $name;
$this->_password = $password;
$this->_connStr = $connstr;
$this->_settings = $settings;
}
public function Connection() {
if ($this->_pdo == NULL) {
$this->_pdo = new PDO($this->_connStr, $this->_name, $this->_password);
}
return $this->_pdo;
}
/* other fancy methods */
public function Close() {
$this->_pdo = NULL;
}
public function __destruct() {
$this->Close();
}
}
我不明白为什么你需要一个Check类来解决这个问题,如果我是你,我会创建像这样的东西:
$currentSession = Session::GetCurrent();
$currentSession->User()->IsInRole('admin');
请注意,会话不是静态的,如果我要编写更完整的解决方案,我会避免调用Session :: GetCurrent()因为当前会话将是某个类实例中的字段(例如HttpApplication)。