Symfony类加载器 - 用法?没有实际使用的例子

时间:2012-04-29 09:27:52

标签: php symfony

我一直在使用Symfony类加载器(阅读其他人,概念并开始实现)。

我也读过http://symfony.com/doc/current/components/class_loader.html 我已经改变了目录结构以适应所有。这是一个小的源代码,它失败了:

文件名:test.php,dir: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,dir:C:/test/BE/src/Location/Location.php

namespace App\Location;

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

2 个答案:

答案 0 :(得分:11)

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

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

自动加载器将在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 microframework。可能是你需要实施的东西。

答案 1 :(得分:2)

您使用:

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

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

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

  

明确注意: 您使用了错误的工具来完成工作。您在过去几小时内共享的所有文件布局都与<{1}} 不兼容

除此之外,如果你为它的参数提供了错误的值,那么该类将无法工作。