Я пытаюсь переписать мой 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" внутри основного класса. Проблема в том, что когда я вызываю функцию config, я получаю эту ошибку:

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

Упоминается, что ошибка исходит из строки

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

Функция .

1
NaughtySquid 24 Апр 2017 в 12:52

2 ответа

Лучший ответ

Ваш config метод является статическим.

Доступ к статическим методам возможен без создания объекта, поэтому $this не является доступным дескриптором текущего объекта.

4
Luke 24 Апр 2017 в 09:56

Вы не можете использовать $this в статическом методе, потому что $this является ссылкой на экземпляр класса, а instance существует только в объектах, вы можете вызывать статический метод без создания объекта, поэтому он не может получить доступ ссылка на класс

Попробуйте изменить свой метод на нестатический и использовать его после создания объекта класса core

1
Arkadi 24 Апр 2017 в 10:06
43584933