2011-01-27 1 views
0

У меня есть index.phpPHP автозагрузчика и Unix Case-Sensitive File-System

<?php 
    include('_controller/Autoloader.php'); 
    Gold_Autoloader::init(); 

    $mysql = new Gold_MySQL(); 

_controller/Autoloader.php

<?php 
class Gold_Autoloader 
{ 

    public static $loader; 

    public static function init() 
    { 
     if (self::$loader == NULL) 
      self::$loader = new self(); 

     return self::$loader; 
    } 

    public function __construct() 
    { 
     spl_autoload_register(array($this, 'controller')); 
     spl_autoload_register(array($this, 'resources')); 
    } 

    public function resources($className) 
    { 
     $className = preg_replace('#Gold_#', '', $className); 
     $className = preg_replace('#_#', DIRECTORY_SEPARATOR, $className); 

     set_include_path(PROJECT_ROOT . '_resources'); 
     spl_autoload_extensions('.php'); 
     spl_autoload($className); 
    } 

    public function controller($className) 
    { 
     $className = preg_replace('#Gold_#', '', $className); 
     $className = preg_replace('#_#', DIRECTORY_SEPARATOR, $className); 

     set_include_path(PROJECT_ROOT . '_controller'); 
     spl_autoload_extensions('.php'); 
     spl_autoload($className); 
    } 
} 

И у меня есть файл _controller/MySQL. php с Gold_MySQL.class. В системе окон этот код работает, и в том числе MySQL.php, но на хостинг этот код не работает ((

[Thu Jan 27 12:55:57 2011] [error] PHP Fatal error: Class 'Gold_MySQL' not found in /home/u91167/youd0main.com/www/index_.php on line 5 

EDIT

Как сделать так, чтобы Unix мог смотреть на какие-либо файлы? Зенд не имеет файлов со строчной буквы.

+0

FYI, использование DIRECTORY_SEPARATOR является излишним. При включении файлов Windows по-прежнему будет принимать разделитель Unix, т.е. C: /folder/MyClass.php все еще работает. DIRECTORY_SEPARATOR следует использовать при взломе системного пути, например $ _SERVER ['DOCUMENT_ROOT']. Я просто предпочел. – Cobby

+0

Кроме того, вам не нужно использовать preg_replace, поскольку вы на самом деле не используете какие-либо регулярные выражения, переключитесь на str_replace и все равно будете работать одинаково ... немного быстрее. – Cobby

ответ

3

Похоже, ваше имя файла чувствительно к регистру, и вы пытаетесь загрузить файл в неправильном случае, т. е может понадобиться gold_mysql.php вместо Gold_MySql.php?

2

Это звучит как проблема с файловой системой сервера. проверить пути и имена файлов для правильного случая.

linux/unix заботимся о кейсе. окон нет.


Примечание: Это ответ на предыдущую версию вопроса

+0

Я думаю, что он об этом знает. Вопрос: «Как сделать так, чтобы Unix мог смотреть на любые файлы?», А не «Что случилось?». –

+0

Вы опоздали. Мой ответ от 27. января 2011 года - с моего ответа вопрос изменяется 4 раза. Принятый с 29 января 2011 года ответ касается случая. –

+0

Вы абсолютно правы. Извините. Старая версия действительно спросила: «Что случилось». –

0

Это может быть, что вы перекрывая включаемый путь. В вашем index.php попробовать что-то вроде

<?php 

set_include_path(
    implode(PATH_SEPARATOR, 
    array(
     realpath('./_controller'), 
     realpath('./_resources'), 
     get_include_path() 
    )) 
); 

И удалить set_include_path() вызывает в вашем классе автозагрузчика.

IMHO. Если вы используете Zend Framework, было бы лучше написать два разделителя автозагрузчиков и направить их в стек автозагрузчика Zend.