3

我有

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

为什么?

4

2 回答 2

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;
}
于 2012-10-27T13:05:53.280 回答
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)。

于 2012-10-27T13:55:02.457 回答