[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: __autoload
AlmazDelDiablo
Имеется файл с функциями, где находится функция __autoload() и грузится этот файл до запуска всего движка. Работает функция нормально (проверял прямым вызывом из проблемного класса), нужный класс грузит. Если в ядре (class Core) попадается вызов неизвестного класса — он отлично подгружается с помощью __autoload(). Но вот из контроллера (class Controller) автовызова __autoload() при создании объекта неизвестного класса не происходит. Как я уже говорил выше, пробовал напрямую из контроллера вызвать __autoload( $sClassName ) — всё сработало отлично.

Может кто сталкивался с такой проблемой?



Спустя 17 минут, 8 секунд (11.06.2012 - 21:25) johniek_comp написал(а):
эмммм....не очень понятно, код давай

Спустя 3 часа, 13 минут, 10 секунд (12.06.2012 - 00:38) AlmazDelDiablo написал(а):
Вот необходимый код. Некоторые части вырезал, дабы не мешали проникнуть в суть дела.

При загрузке модулей через loadModules() в Core — всё ок, автолоад работает.
Однако, при загрузке экшена в Controller через getAction() __autoload не срабатывает и выводится ошибка о том, что указанный класс не найдет.

index.php:
\\ ...

/* Инклюдим функции */
require_once PATH .'core/includes/functions.php';

/* Грузим необходимые файлы с классами */
require_once PATH .'core/classes/Core.class.php';

/* Подключаем загрузчик конфигов */
require_once PATH .'core/classes/Loader.class.php';
Loader::getInstance();

/* Подключаем и запускаем контроллер */
require_once PATH .'core/classes/Controller.class.php';
$oController = Controller::getInstance();
$oController->go();

exit();

?>


functions.php:
/**
* Автозагрузка классов
*
*
@param string $sClassName - название класса
*/

function __autoload( $sClassName ) {
/* Загрузка экшенов */
echo '<p>'. $sClassName .'</p>'; // debug
if( preg_match( '#^Action(\w+)#i', $sClassName ) ) {
$fileName = PATH .'actions/'. $sClassName .'.class.php';

if( file_exists( $fileName ) ) {
require_once $fileName;
} else {
die( '<p>__autoload error: [<strong>'. $fileName .'</strong>] Not Found!</p>' );
}

return;
}

/* Загрузка экшенов плагинов */
if( preg_match( '#^Plugin(\w+)\_Action(\w+)#i', $sClassName, $aMatches ) ) {
$fileName = PATH .'plugins/'. strtolower( $aMatches[1] ) .'/actions/Action'. $aMatches[2] .'.class.php';

if( file_exists( $fileName ) ) {
require_once $fileName;
} else {
die( '<p>__autoload error: [<strong>'. $fileName .'</strong>] Not Found!</p>' );
}

return;
}

/* Загрузка модулей */
if( preg_match( '#^Module(\w+)#i', $sClassName, $aMatches ) ) {
$sModuleName = strtolower( $aMatches[1] );
$sFileName = ucfirst( $sModuleName ) .'.class.php';
$fileName = PATH .'modules/'. $sModuleName .'/'. $sFileName;

if( file_exists( $fileName ) ) {
require_once $fileName ;
} else {
die( '<p>__autoload error: [<strong>'. $fileName .'</strong>] Not Found!</p>' );
}

return;
}

/* Загрузка плагинов */
if( preg_match( '#^Plugin(\w+)#i', $sClassName, $aMatches ) ) {
$fileName = PATH .'plugins/'. $aMatches[1] .'/'. $sClassName .'.class.php';

if( file_exists( $fileName ) ) {
require_once $fileName;
} else {
die( '<p>__autoload error: [<strong>'. $fileName .'</strong>] Not Found!</p>' );
}

return;
}
}




Controller.class.php:
class Controller
{
protected $oCore; // Ядро

static private $oInstance;

/**
* Реализация синглтона
*/

static public function getInstance() {
if( empty( self::$oInstance ) ) {
self::$oInstance = new self();
}

return self::$oInstance;
}

/**
* Конструктор. Грузит ядро и инициализирует его.
*/

private function __construct() {
$this->oCore = Core::getInstance();
$this->oCore->init();
}

protected function getAction() {
self::$oAction = new $sClassName();
// Не будем углубляться, откуда берется $sClassName,
// факт в том, что переменная инициализирована
// и корректно выводится при echo и работает в __autoload() при прямом вызове.
// Выглядит как ActionError

}


Core.class.php:
class Core
{

public $aModules = array(); // Загруженные модули

static private $oInstance;

/**
* Реализация синглтона
*/

static public function getInstance() {
if( empty( self::$oInstance ) ) {
self::$oInstance = new self();
}

return self::$oInstance;
}

/**
* Заблокированный конструктор
*/

private function __construct() {}

/**
* Инициализация ядра
*/

public function init() {
$this->loadModules();
}

/**
* Загрузка модулей
*/

protected function loadModules() {
/* Получаем список модулей, которые необходимо загрузить вместе с ядром */
$aCoreModules = explode( ',', Loader::getCfg( 'core', 'core_modules' ) );

foreach( $aCoreModules as $sModule ) {
/* Загружаем модули */
$this->loadModule( $sModule );
}
}


/**
* Загрузчик выбранного модуля
*
*
@param string $sModuleName - имя модуля
*
@return Module - объект плагина
*/

public function loadModule( $sModuleName ) {
/* Проверяем, не загружен ли уже этот модуль */
if( !isset( $this->aModules[$sModuleName] ) ) {
$sClassName = 'Module'. ucfirst( $sModuleName );
/* Заносим модуль в массив */
$this->aModules[$sModuleName] = new $sClassName();
}

/* Возвращаем объект модуля */
return $this->aModules[$sModuleName];
}
}

Спустя 23 минуты, 19 секунд (12.06.2012 - 01:01) neadekvat написал(а):
Собственно, я могу чего-то не увидеть, но пока что поведение объяснить не могу.

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

Спустя 6 минут, 8 секунд (12.06.2012 - 01:07) AlmazDelDiablo написал(а):
Переименовал __autoload в autoload, зарегал как новый автолоад (кстати, большое спасибо за spl_autoload_register, не знал про такую функцию) и всё заработало.

Спасибо smile.gif

Но всё же интересно, почему обычный способ автолоада не работал?

Спустя 4 минуты, 12 секунд (12.06.2012 - 01:11) neadekvat написал(а):
Цитата (AlmazDelDiablo @ 12.06.2012 - 02:07)
Но всё же интересно, почему обычный способ автолоада не работал?

Хм, ты знаешь, для интереса можно было бы покопать форумы или исходники php, но не думаю, что есть смысл это делать ради функции, которая официально не рекомендуется к использованию и, по тем же официальным заявлениям, будет удалена в следующих версиях интерпритатора.

Так что пользуйся новой функцией на здоровье smile.gif
К слову, коль первый раз используешь, можно делать так (что я и посоветовал в первом своем посте):
http://stackoverflow.com/questions/3710480...toload-register
Чем-то даже на перегрузку методов похоже.

P.S. По последней ссылке - обязательно прочти лучший комментарий, в нем содержится дельное замечание.

Спустя 6 часов, 12 минут, 44 секунды (12.06.2012 - 07:24) Placido написал(а):
Цитата (neadekvat @ 12.06.2012 - 01:11)
...официально не рекомендуется к использованию и, по тем же официальным заявлениям, будет удалена в следующих версиях интерпритатора.

Не рекомендуется - это да. Но справедливости ради хотел бы заметить, что пока что она не объявлена "deprecated". И не "будет удалена", а "может быть объявлена устаревшей и удалена в будущем", что абсолютно не факт.

Спустя 6 часов, 1 минута, 47 секунд (12.06.2012 - 13:26) neadekvat написал(а):
Placido, и к чему это ничего не значащее утверждение? Если в документации говорится, что функция "может быть удалена", то на кой черт ею пользоваться? Как обычно, мышки плакали, кололись, но продолжали жрать кактус? Говорят, что лучше не использовать, что могут удалить - так зачем пинать труп?

Спустя 4 часа, 43 минуты, 8 секунд (12.06.2012 - 18:09) Placido написал(а):
Цитата (neadekvat @ 12.06.2012 - 13:26)
Placido, и к чему это ничего не значащее утверждение? Если в документации говорится, что функция "может быть удалена", то на кой черт ею пользоваться? Как обычно, мышки плакали, кололись, но продолжали жрать кактус? Говорят, что лучше не использовать, что могут удалить - так зачем пинать труп?

К тому, что утверждение, что эта функция "по официальным заявлениям, будет удалена" не является истинным. "Будет" и "может быть" - не одно и то же. Абсолютно не факт, что эту функцию когда-нибудь выпилят. Причем в описании самой функции о том, что эта функция может стать deprecated нет ни слова.


_____________
Блог | VK | GitHub | Twitch
Быстрый ответ:

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