Проблема с __autoload в php 5.3.3

Andykalinin

Новичок
Проблема с __autoload в php 5.3.3

Решил тут на досуге один из своих проектов адаптировать под php 5.3 и столкнулся со странной проблемой, погуглив ничего подобного нигде не нашел. Поиск по форуму тоже ничего не дал.
В общем суть вот в чем.
Использую стандартную функцию __autoload
PHP:
function __autoload($class_name)
{
    $filename = strtolower($class_name) . '.php';
    $file = site_path . 'classes' . DIRSEP . $filename;
    if (file_exists($file) == false)
    {
        throw new Exception('Невозможно загрузить класс ' . $class_name);
    }
    require ($file);
}
В php 5.2 проблем никаких, все классы вызываются как положено, а вот в 5.3 вызывается первый класс нормально, а второй вызов приводит к Fatal Error мол класс не существует.
Помогите плиз.
Может я при компиляции php че-то упустил? Хотя вряд ли...
 

AmdY

Пью пиво
Команда форума
так проверь пути $file, а то у тебя две магические константы. зачем вообще использовать DIRSEP, которая судя по всему является сокращённой версией DIRECTORY_SEPARATOR, который легко заменяется написанием путей в юниксстайл, который прекрасно работает и под форточками
 

Andykalinin

Новичок
Да с путями все хорошо. Ведь вызов первого класса все ок показывает.
Вот код который идет после объявления функции.
PHP:
    $fm = new FM;
    require "Smarty.class.php";
    $template = new Smarty();
    require 'includes/cfg.php';
	require 'fb.php';
	$fm->logger = new FB;
	$fm->logger->setEnabled($debug);
    $db = new MYPDO('mysql:host='.$host.';port='.$port.';dbname='.$db.'',$user,$pass);
То есть класс FM нормально вызывается, далее Смарти м FB лежат в include_path, а на вызове MYPDO стопор...
 

dimagolov

Новичок
Andykalinin, во-первых require_once, а не require, а во-вторых не пересказывай, а копируй сообщения об ошибках.
 

tz-lom

Продвинутый новичок
ещё стоит переходить с __autoload на spl_autoload_register
в phpinfo() пути правильные стоят?
 

Andykalinin

Новичок
dimagolov, при использовании require_once ничего не изменится, это нонсенс, если бы в этом проблема была ;)
А от копирования самой ошибки один хрен ничего не изменится, я и так все точно сказал. Но если поможет то Fatal error: Class 'MYPDO' not found in F:\vhosts\site\httpdocs\index.php on line 16
tz-lom, пути phpinfo правильные. Но при чем тут они? А при использовании spl_autoload_register начинает ругаться еще на Смарти и не находит класс Smarty_Internal_Data который однозначно находится в include_dir.

-~{}~ 28.07.10 22:59:

Fatal error: Uncaught exception 'Exception' with message 'Невозможно загрузить класс Smarty_Internal_Data F:\vhosts\site\httpdocs\classes\smarty_internal_data.php' in F:\vhosts\site\httpdocs\includes\startup.php on line 18
 

Вурдалак

Продвинутый новичок
Andykalinin, версия Smarty 3-я? Там вроде бы через spl_autoload_register() регистрируется свой обработчик, поэтому __autoload() и не работает.

-~{}~ 28.07.10 23:06:

Правда вот с spl_autoload_register() проблем быть не должно, разрешено регистрировать несколько обработчиков.
http://php.net/manual/en/function.spl-autoload-register.php

-~{}~ 28.07.10 23:07:

Из своей функции убери выброс exception'а.
 

Andykalinin

Новичок
Вурдалак, в точку. Спасибо. Все решается
PHP:
define('SMARTY_SPL_AUTOLOAD',1);
Перед подключением файла Смарти.

-~{}~ 28.07.10 23:16:

А exception я туда засунул только ради того чтоб понять где глюки, есс-но уберу ;)
 

redbaron

Новичок
похожая проблема с 4й версией vBulletin.

там имеется свой autoload зарегистрированный через spl_autoload_register.

поэтому свою фунцию __autoload надо принудеительно регистрировать через vB::autoloadPreregister('__autoload');
 

Avron2

Новичок
Как __autoload() зарегистрировать через spl_autoload_register. Я хочу чтобы и __autoload() работал и Smarty находился автоматом.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Зачем регистрировать __autoload через spl %)
 

Avron2

Новичок
У меня Smarty лезит в __autoload() и естесственно не находит своего класса.
Затем добавил строки:
PHP:
     define('SMARTY_DIR', '/include/smarty/libs/');
     require_once "$_SERVER[DOCUMENT_ROOT]/include/smarty/libs/Smarty.class.php";
После этого перестает работать мой __autoload.
Я так понял, что Smarty регистрируется через spl_autoload_register.
В инете ответ на свой вопрос не нашел.
Как мне быть?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Avron2
Дописать свой spl_autoload_register и не мучить нас ;)
 

Avron2

Новичок
PHP:
    spl_autoload_register('autoload');
    function autoload($class_name)    {
    require_once($_SERVER['DOCUMENT_ROOT']."/classes/$class_name.php");
}
С этим разобрался.
 

Avron2

Новичок
PHP:
    define('SMARTY_DIR', "$_SERVER[DOCUMENT_ROOT]/include/smarty/libs/");
    require_once(SMARTY_DIR.'Smarty.class.php');
    ..........................................................
    $Smarty = new Smarty();
    $Smarty->display("include/mvc/view/view_index.php");
Выводит следующее сообщение:
Warning: require_once(Z:/home/forum/www/classes/Smarty_Internal_Data.php) [function.require-once]: failed to open stream: No such file or directory in Z:\home\forum\www\include\autoload.inc on line 4
Fatal error: require_once() [function.require]: Failed opening required 'Z:/home/forum/www/classes/Smarty_Internal_Data.php' (include_path='.;/usr/local/php5/PEAR') in Z:\home\forum\www\include\autoload.inc on line 4

Т.е. свой класс Smarty ищет в autoload().
Почему не работает
PHP:
require_once(SMARTY_DIR.'Smarty.class.php');
?
 

Вурдалак

Продвинутый новичок
Потому что нужно проверять существование файла перед тем как пытаться его подключить.
 
Сверху