2012-04-29 70 views
4

我一直在玩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; 
} 
+0

你的错误是什么?您在具体文档中缺少哪些信息? (要求文档有些宽泛,其他人缺少其他信息)。 – hakre 2012-04-29 09:33:02

+0

我写过它作为评论的来源:/ /致命错误:类'疙瘩'没有在..路径中找到.. 在文档中我错过了实际使用。 Shoudl我做:使用或直行“新)”。如果这是一个静态类,等等.. 我同意,我不清楚这一点。尽管我认为这种用法是微不足道的。 – user1271518 2012-04-29 09:36:26

+1

use语句需要添加类名,我怀疑使用\ Pimple是否正确,可能使用\ Pimple \ Pimple? – ilanco 2012-04-29 09:39:10

回答

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/ 
    App/ 
    Location/ 
     Location.php 

然后注册名称空间,如下所示:

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

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

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

由于您打算使用Pimple和一些Symfony组件,请看Silex microframework。可能是你需要实现的东西。

+1

谢谢你的明确和建设性的答案。就是这样。你已经帮助我了解我做错了什么,解决它并指出我需要进一步的工具。 – user1271518 2012-04-29 18:15:08

+0

和BTW:你可以使用Symfony自动加载器加载Pimple。 – 2012-04-29 20:23:26

+0

Tnx!如何正确地做到这一点? :) – user1271518 2012-05-06 12:19:25

2

您使用:

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

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

UniversalClassLoader只适用于PSR-0和PEAR兼容的目录布局。如果你的布局不是,你不应该期望它能够工作,也不应该被记录为适用于不兼容布局。

Explicit Note:You are using the wrong tool to do the job. All file layouts you have shared over the last hours are incompatible with UniversalClassLoader .

除此之外,如果你给它的参数提供了错误的值,这个类就不能工作。

+0

为了使用自动加载程序功能,我宁愿以同样的方式使用它。它不适用于Pimple,也不适用于: use \ APP \ Location \ Location; new \ APP \ Location \ Location(); 给我: 致命错误:类'APP \ Location \ Location' – user1271518 2012-04-29 09:57:53

+0

我想你在这里命名空间的理解做错了。请参阅https://github.com/symfony/ClassLoader/blob/master/UniversalClassLoader.php#L14 - 疙瘩是*非* PSR-0 *和PEAR兼容。从技术上讲,'UniversalClassLoader'是该库的错误类加载器。 – hakre 2012-04-29 09:58:50

+0

我已经通过了一些源代码,但它并没有帮助我:/ 我知道疙瘩不是PSR-0兼容,因为它不是名称间隔..(它应该是全球性的),它不是反模式。 无论哪种方式,我做了测试与位置类,添加一个要求的路径,工作。它只是: namespace App \ Location; class Location {// implementation} 最简单的类... – user1271518 2012-04-29 10:36:05

相关问题