2011-01-27 41 views
0

的index.phpPHP自動加載磁帶機和Unix區分大小寫的文件系統內

<?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的。帶有Gold_MySQL.class的php。 在windows系統這個代碼工作,包括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 

編輯

如何讓讓Unix的可以看看任何文件?Zend公司沒有文件以小寫字母。

+0

僅供參考,您對DIRECTORY_SEPARATOR的使用是多餘的。當包含文件時,Windows仍然會接受Unix分隔符,即。 C:/folder/MyClass.php仍然有效。當爆炸系統生成的路徑時,應使用DIRECTORY_SEPARATOR,如$ _SERVER ['DOCUMENT_ROOT']。 ...我只是偏好。 – Cobby 2011-01-28 01:25:54

+0

另外,你不需要使用preg_replace,因爲你實際上並沒有使用任何正則表達式,所以切換到str_replace,它仍然可以工作,只是更快一點。 – Cobby 2011-01-28 01:27:00

回答

3

聽起來像是你的文件名是大小寫敏感的,你嘗試加載錯誤的情況下的一個文件。例如,你可能需要gold_mysql.php而不是Gold_MySql.php

2

這聽起來像服務器文件系統的一個大小寫敏感的問題。 檢查正確大小寫的路徑和文件名。

linux/unix注意事例。 窗戶沒有。


注:這個答案

0

這可能是你覆蓋包括路徑的早期版本。在你的index.php上試試類似於

<?php 

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

並刪除Autoloader類中的set_include_path()調用。恕我直言,如果您使用的是Zend Framework,最好是寫兩個分隔符自動加載器並將它們推送到Zend的自動加載器堆棧。

相關問題