[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: spl_autoload_register не видит переменные
Страницы: 1, 2
wrun
Доброе время суток!

Наткнулся на проблему:
Автоматически присоединяю классы при помощи spl_autoload_register
файл incs/boot.inc:
<?php
$GLB = array(1,2,3);
// Auto load class files
spl_autoload_register('AutoLoadClass');
function AutoLoadClass($className) {
$FileName = PATH . 'incs/' . strtolower($className) . '.inc';
if(file_exists($FileName))
include_once $FileName;
}
?>


а в фале index.php:
<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/incs/boot.inc';
$db = new MySQL();
print_r($GLB); // <-- Place 1
?>


а в фале incs/mysql.php:
<?php
print_r($GLB); // <-- Place 2
class MySQL {
...


Так вот в Place 2 ошибка:
Notice: Undefined variable: GLB in /var/www/***/data/www/***/incs/mysql.inc on line 2

Почему так? ведь вроде оба файла (boot.inc и mysql.inc) преинклюжены к index.php?
kaww
wrun
файл incs/mysql.php инклудится в AutoLoadClass, соответственно в нем доступны только переменные определенные в освоей области видимости, т.е внутри функции
killer8080
Потому что файл инклюдится не в глобальной области видимости, а в функции AutoLoadClass. И вообще в декларации класса не должно быть никаких глобальных переменных.

UPD опередили rolleyes.gif
wrun
Хорошо, понятно, спасибо


Но подскажите тогда такое:
в MySQL классе есть дефолтовое подключение, и зачастую его достаточно, что сводит инициализацию к минимуму ($db = new MySQL();)
class MySQL {
private $defaults = array(
'host' => 'localhost',
'user' => 'login',
'pass' => 'password',
'db' => 'base',
'port' => NULL,
'socket' => NULL,
'pconnect' => false,
'charset' => 'utf8',
'errmode' => 'error',
'exception' => 'Exception',
);



Но вести настройки MySQL в отдельном файл (не config.inc) весьма не удобно
Так начнется, одни настройки там, другие там и так далее
Что делать?
killer8080
Передавай массив настроек аргументом в конструктор.
wrun
Наверное придется, спасибо!
killer8080
типа так
$db = new MySQL($CONFIG['database']);
wrun
это понятно, хотелось чего-то более изящного
killer8080
Цитата (wrun @ 22.02.2013 - 10:49)
хотелось чего-то более изящного

Например? Использовать глобальные переменные в классах это моветон. Или что ты имеешь ввиду?
wrun
С точки зрения отдельного класса, конечно, полностью согласен

А если рассмотреть это как движок, то понятия Default, Config и Global отваливаются из-за неудобности.

И если в небольшой класс MySQL реально в конструктор скормить нужный config,
То вот в класс Templates уже ненакормишься.

Но думаю что это уже палемика, и с технической стороны вопрос закрыт.

Спасибо за участие!
wrun
И, кстати, всегда же можно в классе проверить глобальную на isset() и уйти на внутренний default - не думаю что это создаст дикую проблему для работы класса
SlavaFr
Цитата (wrun @ 22.02.2013 - 08:41)
Но вести настройки MySQL в отдельном файл (не config.inc) весьма не удобно
Так начнется, одни настройки там, другие там и так далее
Что делать?

подключение базы может спокойно в config.inc находится, так как без нее как правило почнти не чего не работает.

Создай также фабрику (возможно по принципу singelton) , которая занимается инициализированием MySQL объекта. Таким образом класс MySQL останится чистым, а вся инициализация proизойдет в DBFactory::getInstance()

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
kaww
Цитата (wrun @ 22.02.2013 - 08:56)
А если рассмотреть это как движок, то понятия Default, Config и Global отваливаются из-за неудобности.

как раз в плане движка удобно иметь общий конфиг, и либо наследовать от какого-то базового класса, либо определять в классах метод getConfig типа такого
private function getConfig()
{
$this->config = Registry::getInstance()->config->{__CLASS__};
}
killer8080
Цитата (wrun @ 22.02.2013 - 10:56)
То вот в класс Templates уже ненакормишься.

что мешает передать его по ссылке?
wrun
Цитата (kaww @ 22.02.2013 - 13:04)
Цитата (wrun @ 22.02.2013 - 08:56)
А если рассмотреть это как движок, то понятия Default, Config и Global отваливаются из-за неудобности.

как раз в плане движка удобно иметь общий конфиг, и либо наследовать от какого-то базового класса, либо определять в классах метод getConfig типа такого
private function getConfig()
{
$this->config = Registry::getInstance()->config->{__CLASS__};
}

Я в ООП новичок, можно немного по-конкретнее, каким образом хранить config? как класс?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.