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

adminメソッドがqueryメソッドを呼び出し、queryメソッドがdbインスタンス変数を使用しています。クラスがインスタンス化されていないため、db変数は存在しません。

私の提案は、adminメソッドを非静的にし、次のようなコードを使用することです。

$mycheck = new Check();
$mycheck->admin();

または、php 5.4を使用していて、ワンライナーを使い続けたい場合:

(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();
    }
}

そして、私があなただったら、私はこのような何かを作成するので、なぜあなたがこれらすべてのためにチェッククラスを必要とするのかわかりません:

$currentSession = Session::GetCurrent();
$currentSession->User()->IsInRole('admin');

セッションは静的ではなく、より完全なソリューションを作成する場合は、現在のセッションがクラスのインスタンス(HttpApplicationなど)のフィールドになるため、Session :: GetCurrent()呼び出しを回避することに注意してください。

于 2012-10-27T13:55:02.457 に答える