4

我一直在玩一些 Symfony 类加载器(阅读其他内容、概念并开始实现)。

我已经阅读了http://symfony.com/doc/current/components/class_loader.html以及我已经更改了目录结构以适应所有内容。这是一个失败的小源代码:

文件名:test.php,目录:C:/test/BE/src/main.php

   <?php
    define('BASE_DIR','/../..');

    echo BASE_DIR.'/BE/libs/symphony/component/ClassLoader/2.1.0/UniversalClassLoader.php';
    require_once BASE_DIR.'/BE/libs/symphony/component/ClassLoader/2.1.0/UniversalClassLoader.php';

    use Symfony\Component\ClassLoader\UniversalClassLoader;

    $loader = new UniversalClassLoader();
    $loader->registerNamespace('App\Location\Location', 'Location/Location');

     // You can search the include_path as a last resort.
    $loader->useIncludePath(true);    
    $loader->register();
    use App\Location\Location;
    new App\Location\Location(); //Fatal error: Class 'App\Location\Location' not found in C:/test/BE/src/main.php

文件名:Location.php,目录:C:/test/BE/src/Location/Location.php

namespace App\Location;

class Location{
    private $lat;
    private $lng;
}
4

2 回答 2

11

通过如下注册您的命名空间:

$loader->registerNamespace('App\Location\Location', 'Location/Location');

autoloader 将在文件中查找App\Location\Location类。Location/Location/App/Location/Location.php请注意,文件/目录名称区分大小写。

第一个参数registerNamespace()是命名空间或命名空间的一部分。第二个参数是 PSR-0 兼容库的路径。这意味着该路径内的目录结构应遵循 PSR-0 标准。计算给定命名空间的路径时使用此路径。

如果你想保持你当前的目录结构,下面的代码应该适合你:

$loader->registerNamespace('App', __DIR__);

我宁愿将您的源代码放在一个公共目录中,例如 src:

src/
  App/
    Location/
        Location.php

然后注册命名空间如下:

$loader->registerNamespace('App', 'src');

通过这样做,您只是告诉自动加载器它应该在 src 文件夹中查找 App 命名空间类。请注意,它适用于 App 命名空间中的每个类(遵循 PSR-0)。

前段时间我写了一篇关于 Symfony 自动加载器的博文。你可能会发现它很有帮助:Autoloading classes in an any PHP project with Symfony2 ClassLoader component

由于您计划使用 Pimple 和一些 Symfony 组件,请查看Silex 微框架。可能是你需要实现的东西。

于 2012-04-29T13:22:34.240 回答
2

你用:

$loader->registerNamespace('Pimple', BASE_DIR.'/BE/libs/Pimple/1.0.0/lib/Pimple');

为 Pimple注册Pimple命名空间是没有用的,因为 Pimple 是默认命名空间中的一个类(它没有命名空间)。

UniversalClassLoader仅适用于 PSR-0 和 PEAR 兼容的目录布局。如果您的布局不是,您不应该期望它可以工作,也不应该记录它适用于不兼容的布局。

明确说明: 您使用了错误的工具来完成这项工作。您在过去几个小时内共享的所有文件布局都.UniversalClassLoader

除此之外,如果您为其参数提供错误的值,则该类将无法工作。

于 2012-04-29T09:41:57.577 回答