簡體   English   中英

PHP:AutoLoader 能否在單個 php 文件中加載多個類?

[英]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否則您必須進行一些算法才能知道AB位於同一頁面上.

我會執行上述模式或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 ,其中包含兩個類AB

<?php

namespace Protobuf;

class A {
}

class B {
}

我們添加classmapcomposer.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM