我一直在使用 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;
}
最佳答案
按如下方式注册您的命名空间:
$loader->registerNamespace('App\Location\Location', 'Location/Location');
自动加载器将在 Location/Location/App/Location/Location.php
文件中查找 App\Location\Location
类。请注意,文件/目录名称区分大小写。
registerNamespace()
的第一个参数是命名空间或命名空间的部分。第二个参数是 PSR-0 兼容库的路径。这意味着该路径内的目录结构应遵循 PSR-0 标准。在计算给定 namespace 的路径时,不使用此路径。
如果你想保留你当前的目录结构,下面的代码应该适合你:
$loader->registerNamespace('App', __DIR__);
我宁愿将您的源代码放在一个公共(public)目录中,例如 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 .可能是您需要实现的东西。
关于php - Symfony 类加载器 - 用法?没有实际使用的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371073/