Singleton DB соединяется с файлом конфигурации - PullRequest
1 голос
/ 30 сентября 2019

Ниже приведен мой код для подключения, который прекрасно работает без файла конфигурации (файл .ini). Но если я использую файл конфигурации, я получаю сообщение об ошибке:

Неустранимая ошибка: Выражение константы содержит недопустимые операции в файле singletonDB.php в строке 13.

Но, как вы можете видеть, переменные $dsn, $user и $pass не являются статическими переменными. Я не понимаю, почему у меня возникает ошибка, связанная со статической переменной, для нестатической переменной.

Моя конечная цель - использовать файл конфигурации, а также сохранять только одноэлементное соединение с БД.

<?php
$config = parse_ini_file("config.ini");
var_dump($config);
// Singleton to connect db.
class ConnectDb
{

    // Hold the class instance.
    private static $instance = null;

    private $pdo;

    private $dsn = $config['dsn_config'];

    private $user = $config['user_config'];

    private $pass = $config['password_config'];

    // The db connection is established in the private constructor.
    private function __construct()
    {
        echo nl2br("Inside constructor"); 
        $this->pdo = new PDO($this->dsn, $this->user, $this->pass);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public static function getInstance()
    {
        if (! self::$instance) {
            self::$instance = new ConnectDb();
        }

        return self::$instance;
    }

    public function getConnection()
    {
        return $this->pdo;
    }
}

А это мой файл конфигурации

;Local
dsn_config = 'mysql:host=127.0.0.1;port=3306;dbname=db_name;';
user_config = 'root';
password_config = 'root';

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Проблема не в $dsn, $user или $pass, а в $config. Вы не можете назначить $config таким образом. Если вы измените их на строковые или другие значения (int, array, bool), вы обнаружите, что ошибка исчезла:

private $dsn  = false;  # All of these are 
private $user = [];     # are valid
private $pass = 1234;   # assignments

Тогда проблема в том, как назначить аргументы ini? Обычный метод - просто вставить в конструкцию класса, когда он создан:

class ConnectDb
{
    private static $instance = null;

    private $pdo;    
    private $dsn = '';
    private $user = '';
    private $pass = '';

    private function __construct($dsn, $user, $pass)
    {
        $this->dns = $dns;
        $this->user = $user;
        $this->pass = $pass;

        echo nl2br("Inside constructor"); 
        $this->pdo = new PDO($this->dsn, $this->user, $this->pass);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    ...etc.

Использовать:

<?php
$config = parse_ini_file("config.ini");
# Inject into the construct here
$Db = new ConnectDb($config['dsn_config'], $config['user_config'], $config['password_config']);

Другой метод может использовать определения (константы):

<?php
$config = parse_ini_file("config.ini");
# Create some defines
define('DB_DSN', $config['dsn_config']);
define('DB_USER', $config['user_config']);
define('DB_PASS', $config['password_config']);

Тогда класс будет выглядеть так:

class ConnectDb
{
    private static $instance = null;

    private $pdo;
    private $dsn = '';
    private $user = '';
    private $pass = '';

    private function __construct()
    {
        # Assign the constants here ALTHOUGH...
        # I don't know that there is a good reason to make these class 
        # variables. I would just put the constants into the construct of
        # the PDO below. I don't know that you are going to need to reference
        # these variables after you have created the PDO connection.
        $this->dns = DB_DSN;
        $this->user = DB_USER;
        $this->pass = DB_PASS;

        echo nl2br("Inside constructor"); 
        $this->pdo = new PDO($this->dsn, $this->user, $this->pass);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    ...etc.
0 голосов
/ 01 октября 2019

Я не хотел создавать объект в другом месте моей программы, поэтому, основываясь на пояснениях @Rasclatt, я переместил код чтения конфигурации в конструктор, и теперь он работает нормально. Ниже приведен обновленный код.

Имя файла "singletonDB.php"

<?php

// Singleton to connect db.
class ConnectDB
{

    // Hold the class instance.
    private static $instance = null;

    private $pdo;

    private $dsn = '';

    private $user = '';

    private $pass = '';

    // The db connection is established in the private constructor.
    private function __construct()
    {
//         $pdo = new PDO($dsn, $user, $password);
        $config = parse_ini_file("../config.ini");
        echo nl2br("var_dump ing config");
        var_dump($config);

        $this->dsn = $config['dsn_config'];
        $this->user = $config['user_config'];
        $this->pass = $config['password_config'];

        echo nl2br("Inside constructor"); 
        $this->pdo = new PDO($this->dsn, $this->user, $this->pass);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public static function getInstance()
    {
        if (! self::$instance) {
            self::$instance = new ConnectDB();
        }

        return self::$instance;
    }

    public function getConnection()
    {
        return $this->pdo;
    }
}

Позже вы можете получить форму подключения к БД как

require_once 'singletonDB.php';
$instance = ConnectDB::getInstance();
$conn = $instance->getConnection();
var_dump($conn);

Однако яне уверен, что это хороший способ программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...