我一直在使用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;
}
答案 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}} 不兼容。
除此之外,如果你为它的参数提供了错误的值,那么该类将无法工作。