Может кто сталкивался с такой проблемой?
Спустя 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:
functions.php:
Controller.class.php:
Core.class.php:
При загрузке модулей через 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, появление которой ты не захотел рассказать.
Вообще, попробуй spl_autoload_register (заодно разобьешь свою огромную функцию). Не заработает - значит, где-то у тебя ошибка. например, в той же переменной $sClassName, появление которой ты не захотел рассказать.
Спустя 6 минут, 8 секунд (12.06.2012 - 01:07) AlmazDelDiablo написал(а):
Переименовал __autoload в autoload, зарегал как новый автолоад (кстати, большое спасибо за spl_autoload_register, не знал про такую функцию) и всё заработало.
Спасибо
Но всё же интересно, почему обычный способ автолоада не работал?
Спасибо

Но всё же интересно, почему обычный способ автолоада не работал?
Спустя 4 минуты, 12 секунд (12.06.2012 - 01:11) neadekvat написал(а):
Цитата (AlmazDelDiablo @ 12.06.2012 - 02:07) |
Но всё же интересно, почему обычный способ автолоада не работал? |
Хм, ты знаешь, для интереса можно было бы покопать форумы или исходники php, но не думаю, что есть смысл это делать ради функции, которая официально не рекомендуется к использованию и, по тем же официальным заявлениям, будет удалена в следующих версиях интерпритатора.
Так что пользуйся новой функцией на здоровье

К слову, коль первый раз используешь, можно делать так (что я и посоветовал в первом своем посте):
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