0

我有以下目录结构:
/var/www/Project1/Project1.php
/var/www/Project1/User/UserProfile.php
Project1.php 内部:

<?php
namespace Project1;
set_include_path( __DIR__ );
spl_autoload_extensions('.php');
spl_autoload_register();

use User\UserProfile;

$u = new Avatar();
...

?>

在 UserProfile.php 中:

<?php    
namespace Project1\User;
class Avatar{
}
...
?>

当我执行时,php Project1.php我得到:

PHP 致命错误:spl_autoload9():无法加载 Class User\UserProfile

我没有看到问题。

4

1 回答 1

1

spl_autoload_register();当没有参数调用时,只会注册默认的自动加载器,它无法用你的项目布局处理命名空间。您必须注册自己的方法才能使其工作。像这样:

spl_autoload_register('my_autoload');

自动加载功能来了。此函数期望类以如下方式存储:

/path/to/project/Namespace/Classname.php
/path/to/project/Namespace/Subnamespace/Classname.php

您可以将类命名为\Namespaces\Classname或旧式方式Namespace_Classname

function my_autoload ($classname) {
    // if the class where already loaded. should not happen
    if (class_exists($classname)) {
        return true;
    }   

    // Works for PEAR style class names and namespaced class names
    $path = str_replace(
        array('_', '\\'),
        '/',
        $classname
    ) . '.php';

   if (file_exists('/path/to/project/' . $tail)) {
        include_once 'path/to/project/' . $tail;
        return true;
    }   

    return false;
}   

请注意,该函数取自我的 github 包Jm_Autoloader。该包提供了更多功能,如多个包含路径、路径前缀和静态自动加载(使用预定义的 assoc 数组类名 => 文件名)。如果你喜欢,你可以使用它;)

于 2013-04-18T20:45:22.017 回答