对PHP OOP范围感到困惑

时间:2017-04-24 09:52:03

标签: php mysql oop pdo

我试图重新编写我的PDO MySQL类,它使用了一种依赖注入形式。

以下是它的连接方式:

public function __construct($dsn, $username, $password)
{
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_STATEMENT_CLASS => array("EPDOStatement\EPDOStatement", array($this)),
        PDO::ATTR_EMULATE_PREPARES   => false, // allows LIMIT placeholders
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    ];
    parent::__construct($dsn, $username, $password, $options);
}

然后它被这样称呼:

$dbl = new db_mysql("mysql:host=".$db_conf['host'].";dbname=".$db_conf['database'],$db_conf['username'],$db_conf['password']);

现在,在另一个名为" core"的类中。它在__construct中有这个:

class core
{
    public $database;
    function __construct($database)
    {   
        $this->database = $database;
    }

public static function config($key)
{
    if (empty(self::$config))
    {
        // get config
        $get_config = $this->database->select("config", '`data_key`, `data_value`');
        $fetch_config = $get_config->fetch_all();

        foreach ($fetch_config as $config_set)
        {
            self::$config[$config_set['data_key']] = $config_set['data_value'];
        }
    }

    // return the requested key with the value in place
    return self::$config[$key];
}
}

这样称呼如下:

$core = new core($dbl);

所以它接受数据库连接,并将其分配给$ database,该数据库被设置为" public"核心课内。问题是当我调用配置函数时,我收到此错误:

PHP Fatal error:  Uncaught Error: Using $this when not in object context

它提到错误来自行

  

"$this->database->select" inside the "config"

功能

2 个答案:

答案 0 :(得分:4)

您的config方法是静态的。

可以在没有实例化对象的情况下访问静态方法,因此$this不是当前对象的可用句柄。

答案 1 :(得分:1)

你不能在静态方法中使用$this,因为$this是对类实例的引用,instance只存在于对象中,你可以在不创建对象的情况下调用静态方法,所以它无法访问类引用..

尝试将您的方法更改为非静态方法,并在创建core类对象

后使用它