ООП: странно работает автоматическая функция

deli

Работающий код:
    class Configs
    {
        public function __construct()
        {
            define('CONFIG_INCLUDE', true);
            //require_once('includes/inc.config.php');
        }
        
        public function connect_db()
        {
            require_once('includes/inc.config.php');
            $db = mysql_connect($config['db']['host'], $config['db']['user'], $config['db']['pswd']);
            mysql_select_db($config['db']['name']);
            return $db;
        }
    }
Если сделать так:
    class Configs
    {
        public function __construct()
        {
            define('CONFIG_INCLUDE', true);
            require_once('includes/inc.config.php');
        }
        
        public function connect_db()
        {
            //require_once('includes/inc.config.php');
            $db = mysql_connect($config['db']['host'], $config['db']['user'], $config['db']['pswd']);
            mysql_select_db($config['db']['name']);
            return $db;
        }
    }
Т.Е. подключать файл конфигов через __construct, то выводит ошибку, при вызове функции connect_db() :
Notice: Undefined variable: config in /Users/deli-b/Yandex.Drive/Documents/projects/web projects/golder/includes/inc.functions.php on line 35Notice: Undefined variable: config in /Users/deli-b/Yandex.Drive/Documents/projects/web projects/golder/includes/inc.functions.php on line 35Notice: Undefined variable: config in /Users/deli-b/Yandex.Drive/Documents/projects/web projects/golder/includes/inc.functions.php on line 35Notice: Undefined variable: config in /Users/deli-b/Yandex.Drive/Documents/projects/web projects/golder/includes/inc.functions.php on line 36
Объясните пожалуйста, почему переменная не найдена, ведь разницы нету в местах подключения. P.S. вызываю функцию так:
    $db = new Configs();
    $connect = $db->connect_db();
Вроде все правильно должно быть, но не работает второй вариант...(
8 ответов

deli

почитайте про области видимости переменных внутри функций


deli

Причем здесь это? Файл подключается, это происходит не внутри функции. Я подключаю файл inc.config.php, где находитcя только переменная $config (массив). Если подключить ее к другому файлу, через requery_once, то переменные будут доступны. Ведь функция только подключает файл....


deli

class Configs
    {
        private $config = array();
 
        public function __construct()
        {
            define('CONFIG_INCLUDE', true);
            require_once('includes/inc.config.php');
            $this->config = $config;
        }
        
        public function connect_db()
        {
            $db = mysql_connect($this->config['db']['host'], $this->config['db']['user'], $$this->config['db']['pswd']);
            mysql_select_db($this->config['db']['name']);
            return $db;
        }
    }


deli

Передавать переменные для подключения в массиве не самая лучшая идея особенно с точки зрения производительности.Чем вам константы не угодили???


deli

мм... можно пример? Как подключать их, к примеру. Так же файл через requery_once, после работать как и с переменными?


deli

Файл подключается, это происходит не внутри функции.
public function __construct() { 
define('CONFIG_INCLUDE', true); 
require_once('includes/inc.config.php'); 
}
это не внутри функции?


deli

Причем здесь это? Файл подключается, это происходит не внутри функции. Я подключаю файл inc.config.php, где находитcя только переменная $config (массив). Если подключить ее к другому файлу, через requery_once, то переменные будут доступны. Ведь функция только подключает файл....
замените require_once('includes/inc.config.php'); в коде, содержимым файла includes/inc.config.php. Получите то что видит интерпретатор.. Сразу будет видна ошибка. а еще define в классах это круто


deli

мм... можно пример? Как подключать их, к примеру. Так же файл через requery_once, после работать как и с переменными?
В connect.conf.php пишешь к примеру так
<?php
    /**
     * Данные для подключения к базе данных
     */
     define('DB_DRIVER', 'mysql:host=localhost;dbname=bs_db');
     define('DB_USER', 'root');
     define('DB_PASS', '');
?>
Потом в проекте цепляешь:
<?php
   //Определение абсолютного пути и его преобразование к кроссплатформенному виду.
   define('ABSPATH', str_replace('\\', '/', dirname(__FILE__).'/'));
   
   //Настройки для БД
   require_once ABSPATH .'app/vars/connect.conf.php';
?>
P.S Считаю что файлы критичные для функционирования надо цеплять именно через require_once.