【问题标题】:Confused about PHP OOP scope对 PHP OOP 范围感到困惑
【发布时间】:2017-09-20 22:46:06
【问题描述】:

我正在尝试重写我的 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);

所以它正在获取数据库连接,并将其分配给在核心类中设置为“public”的 $database。问题是当我调用配置函数时,我得到了这个错误:

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

它提到错误来自该行

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

功能。

【问题讨论】:

  • 你是怎么调用配置函数的?
  • 你的缩进是怎么回事?它使阅读变得困难。

标签: php mysql oop pdo


【解决方案1】:

您的 config 方法是静态的。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-08
      • 1970-01-01
      • 2011-07-17
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多