[英]PHP: Is AutoLoader able to load multiple class in a single php file?
引用自自動加載類:
許多編寫面向對象應用程序的開發人員為每個類定義創建一個 PHP 源文件。 最大的煩惱之一是必須在每個腳本的開頭編寫一長串所需的包含(每個類一個)。
在 PHP 5 中,這不再是必要的。 spl_autoload_register() 函數注冊任意數量的自動加載器,如果當前未定義類和接口,則可以自動加載它們。 通過注冊自動加載器,PHP 有最后的機會在它失敗並出現錯誤之前加載類或接口。
那么問題來了,如果一個php文件中有多個類,是否適合autoload使用呢? 還是我必須使用require filepath
語句?
比如我在Protobuf\\Client.php下有一個協議文件:
<?php
namespace Protobuf;
class A {
...
}
class B {
...
}
您必須有一些復雜的函數才能從名為Client.php
的文件中自動加載這些類。 這個想法是將您的namespace\\classname
轉換為directory\\filename.php
在這種情況下,您需要將文件A.php
然后當您調用new Protobuf\\A()
它會找到它。 否則,您將不得不創建一個過於復雜的自動加載器。
假設您確實創建了自動加載器,以便它找到A
類,然后您可以在同一個文件中使用B
,但前提是您已經自動加載了A
否則您必須進行一些算法才能知道A
和B
位於同一頁面上.
我會執行上述模式或Magento 等應用程序采用的模式,通過替換下划線將類名轉換為目錄路徑:
$class = new Core_Classes_MyClass_Client();
您的自動加載器將替換下划線並加載:
Core/Classes/MyClass/Client.php //or similar scheme
這對我來說是一種簡單的方法,但我更喜歡使用命名空間和類。 上述方法目前不受歡迎,從命名的角度來看,很容易混淆,因為很多類可能在同一個文件夾中,或者嵌套在子文件夾的深處。 你可以得到一些非常長的類命名。
擴展 Rasclatts 非常翔實的答案,
理想情況下,在自動加載時將類分開總是很好的做法。 我強烈建議研究 Composers PSR-0 Namespace Autoloading
PSR-0 允許您將所有類精美地組織到具有無限深度的子文件夾中,采用以下文件夾結構
\system
- Members
- Members.php
- Auth
- Auth.php
- Database
- Database.php
對於這個例子,在上面的每個 php 文件中,你都會有namespace MyNameSpace;
在您的類聲明之前,然后在您的composer.json
您將有類似於(文檔)的內容:
"autoload": {
"psr-0": { "MyNameSpace": "/system" }
}
Composer 應該安裝在您的本地/主機計算機上,以便您編譯自動加載文件、打開終端並導航到您的項目目錄並鍵入:
composer dump-autoload -o
現在一切都井井有條,您可以訪問類似於以下內容的類:
\MyNameSpace\Auth::staticFunction();
是和否,但是如果我為一個非常大的 WSDL 生成(自動)類和方法呢?
即。 對於一百多個方法,您可能有一百個methodRequest(作為類對象),接下來的一百個methodResponse(作為類對象)和大型數組,即ClassMap。
有時最好在一個文件中處理這些東西,特別是在沒有好的 WSDL 文檔的情況下進行開發時。
為了直接回答這個問題,我們可以在composer.json
使用classmap
for autoload
來支持包含多個類的單個文件。
例如,我們將支持單個文件Protobuf\\Client.php
,其中包含兩個類A
和B
:
<?php
namespace Protobuf;
class A {
}
class B {
}
我們添加classmap
在composer.json
如下:
{
"name": "hailong/myproj",
"autoload": {
"classmap": [
"Protobuf/Client.php"
]
}
}
然后,在main.php
我們可以使用A
類和B
類:
<?php
require __DIR__.'/vendor/autoload.php';
use Protobuf\A;
use Protobuf\B;
$a = new A();
$b = new B();
最后,不要忘記在更改composer.json
后運行composer dump-autoload
,這將神奇地生成我們main.php
中所需的autoload.php
。
對於還不熟悉作曲家的人,這里是我們將得到的最終文件結構:
myproj % tree
.
├── Protobuf
│ └── Client.php
├── composer.json
├── main.php
└── vendor
├── autoload.php
└── composer
├── ClassLoader.php
├── LICENSE
├── autoload_classmap.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
└── installed.json
3 directories, 12 files
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.