2012-09-12 47 views
2

我有一個文件(PHP的xmlrpc庫),我想用於Symfony2類(因此在Symfony2項目中)。require_once()和自動加載器 - 如何加載平坦的PHP?

因爲寫here

這是我能不能使用自動加載[自動裝卸]從文件加載類, 實現以下約定之一:

1) The technical interoperability standards for PHP 5.3 namespaces and 
    class names; 
2) The PEAR naming convention for classes. 

如果您的課程和用於您的項目 的第三方庫遵循這些標準,Symfony2自動加載器是唯一的自動加載器 您將永遠需要。

我要去使用的類不符合其中一個要求。

所以,如果我不能自動加載該文件,因爲是不可能的(因爲我理解,但我可以去錯了)使用require_once(或簡稱require)與namespace,究竟是什麼問題,該如何解決?

+0

我問了一個類似的問題,並給出了很好的建議。請參閱http://stackoverflow.com/questions/11903432/autolading-non-psr0-libraries-in-symfony-2-0-x –

+0

@CarlosGranados我的文件包含多個類...此解決方案是否適合我的具體情況案件?此外,我使用MapClassLoader註冊了我的「舊」php文件:然後讓我像註冊到自動加載器一樣使用它(所以使用'src/to/my/file/folder/path')? – DonCallisto

+0

我認爲它應該工作。作曲家所做的是註冊一張課程地圖和他們「生活」的地方。然後,您只需爲這些類添加「使用」語句。如果他們不使用命名空間,只需添加使用classname。如果他們使用名稱空間添加使用FQN –

回答

5

假設你有一個名爲xmlrpc.lib.php一個文件,內容如下:

<?php 
class XMLRPC_Server { 
    // ... 
} 

class XMLRPC_Request { 
    // ... 
} 

class XMLRPC_Response { 
    // ... 
} 

您可以創建MapClassLoader一個實例來處理它自動加載:

// Create map autoloader 
$mapLoader = new MapClassLoader(array(
    'XMLRPC_Server' => __DIR__.'/../library/xmlrpc.lib.php', 
    'XMLRPC_Request' => __DIR__.'/../library/xmlrpc.lib.php', 
    'XMLRPC_Response' => __DIR__.'/../library/xmlrpc.lib.php', 
)); 

// Register autoloader 
$mapLoader->register(); 

當這些類中的一個將被自動已加載,其他人也將自動加載,因爲他們共享相同的PHP文件。

+0

這是做這件事的好方法。我們使用另一個比你的更糟糕的「技巧」:創建一個使用'require_once()'的「包裝」類,並將所有這些類包含在這個文件中。然後,我們使用MapClassLoader到該文件,它的工作原理...是不是你的解決方案,但它的工作原理;-) – DonCallisto