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

use*_*518 4 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
Run Code Online (Sandbox Code Playgroud)

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

namespace App\Location;

class Location{
    private $lat;
    private $lng;
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*las 11

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

$loader->registerNamespace('App\Location\Location', 'Location/Location');
Run Code Online (Sandbox Code Playgroud)

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

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

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

$loader->registerNamespace('App', __DIR__);
Run Code Online (Sandbox Code Playgroud)

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

src/
  App/
    Location/
        Location.php
Run Code Online (Sandbox Code Playgroud)

然后注册名称空间如下:

$loader->registerNamespace('App', 'src');
Run Code Online (Sandbox Code Playgroud)

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

前段时间我写了一篇关于Symfony自动加载器的博客文章.您可能会发现它很有用:使用Symfony2 ClassLoader组件在任何PHP项目中自动加载类

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