2012-04-29 72 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

相關問題