Twitt
@Twitt

Как обойти global в данной ситуации?

есть класс Database.php , и есть файл config.php.
Собственно, когда в Database.php делаю require(__DIR__ . '/config.php');
и хочу в construct заюзать переменную с config.php, до тех пор пока я не введу global $db_name; я не смогу заюзать их.
Т.к. я знаю что глобалки это зло, и хочу изначально держать код в чистоте, нужно найти обход данного кейса.

Так вот, какой пусть обхода в данной ситуации?
Сейчас это выглядит вот так
public function __construct()
    {
        try {
            global $config;
            $this->pdo = new PDO("mysql:host=localhost;dbname=" . $config['db_name'], $config['db_user'], $config['db_password']);
        } catch(Exception $e) {
            echo 'Sorry ' . $e->getMessage();
        }
    }
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Если у вас есть цель, кроме «сделать этот код рабочим» есть еще цели: изучить и делать правильно,
советую посмотреть в сторону внедрения DI контейнера, для конфигов в том числе.

Подробно об этом рассказано в видео Елисеева, ссылка на отрывок:
PSR-7 фреймворк 4/6: Контейнер внедрения зависимостей

Ну или взять уже готовый компонент DI (например от Symfony)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Передавайте параметры соединения в конструктор при создании экземпляра

class Database
{
	public function __construct($db_name, $db_user, $db_password)
	{
		try {
			$this->pdo = new PDO("mysql:host=localhost;dbname=" . $db_name, $db_user, $db_password);
		} catch (Exception $e) {
			echo 'Sorry ' . $e->getMessage();
		}
	}
}


...........................

$db = new Database($config['db_name'], $config['db_user'], $config['db_password']);


И говорят, что try/catch в данном случае - моветон, но это не точно
Ответ написан
Sanovskiy
@Sanovskiy
Веб-разработчик с 2005 года
Паттерн Репозиторий
Глобал не нужен. Лишние параметры не нужны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы