2013-01-15 69 views
2

我遇到了一个非常奇怪的问题,我的自动加载器功能。奇怪的需要路径错误

这是我的自动加载功能,从PSR-0 standard采取:

function __autoload($className) { 

    $className = ltrim($className, '\\'); 
    $fileName = ''; 
    $namespace = ''; 
    $lastNsPos = strrpos($className, '\\'); 
    if ($lastNsPos) { 
     $namespace = substr($className, 0, $lastNsPos); 
     $className = substr($className, $lastNsPos + 1); 
     $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; 
    } 
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; 

    require dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName; 
} 

我已经对该函数添加的只是修改dirname(__FILE__)require功能我保持这个功能在目录名为includes,我的所有其他课程都保留在那里。这段代码适用于我的另一个项目,所以我不确定这里有什么问题。

我有一个文件:includes\SQL\Persistable.php,命名空间声明为namespace SQL;。当自动加载运行,它给了我这个错误:

Warning: require(/home/user/public_html/phpProject/includes/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52 

我知道文件不存在,但我不知道为什么它加载一个。它应该要求/home/user/public_html/phpProject/includes/SQL/Persistable.php。然而,当我改变require功能像这样(只是为了测试):

require dirname(__FILE__) . DIRECTORY_SEPARATOR . ' ' . $fileName; 

我得到:

Warning: require(/home/user/public_html/phpProject/includes/ SQL/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52 

我不知道为什么加空格,或者实际上其他任何字符比正斜杠,将导致require函数包含$fileName的第一部分。我也试过:

echo dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName; 

和输出是:

/home/user/public_html/phpProject/includes/SQL/Persistable.php 

但是,它显然是不能解释像在require功能。为什么?

我也试过__DIR__,通过set_include_path()明确设置包括路径,把功能在其自己单独的文件,包括,和realname(),他们都没有工作。正如我所说,此代码已在之前工作,所以我不知道为什么我现在想出这个问题!

+0

你可以给我们从xdebug,或类似的东西stacktrace。那可能是因为你正在使用类“Persistable”,而没有用'use SQL;'指定命名空间?在这种情况下,您的自动加载器将完成它的功能。 – devdRew

+0

@devdRew我不知道如何安装xdebug,但在我的文件中创建一个Persistable实例的代码是:'$ section = new \ SQL \ Persistable();'。我没有指定'use'语句,因为我在这里使用了命名空间\ class的绝对路径。 –

+0

尝试在__autoload()函数的开头放置'var_dump($ className)',并用输出结果填写问题。因为在我看来,最有可能的情况是你的项目中的某个地方使用的不是绝对路径。 – devdRew

回答

0

有问题的声明是一份准备好的声明的结果取:

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'Persistable'); 

改变它:

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\SQL\Persistable'); 

的帮助下解决问题......但我现在面临着一个PDO问题,这是另一个问题。

+0

告诉你:)不是绝对路径... – devdRew