2010-08-11 80 views
19

如果我在不同的php文件中包含幾個類,並將其包含到單個文件中,並且其中一些類具有對其他類的依賴關係,那麼它們的包含順序是否很重要?或者,只是簡單地將它們包括在內(以任何順序),然​​後才能使用所有重要的東西?在PHP中,類定義的順序是否重要?

+0

這是一個可以通過簡單嘗試就能得到最好解答的問題。 – erisco 2010-08-11 13:49:33

+5

我確實嘗試過,它*出現*能夠正常工作。然而,對於PHP來說相對陌生,我想確保下面沒有任何問題可能會在以後引起我的興趣。 – TaylorOtwell 2010-08-11 14:25:06

+8

認爲最流行的PHP框架的創建者在5年前對PHP來說只是'相對較新的'...好工作@TaylorOtwell – dangel 2016-02-14 04:48:23

回答

12

是的,它很重要。

我建議使用autoloading來解決類依賴問題。這種方式只在實際需要時才加載,而且您不必費心手工添加每個PHP文件。

儘管如此,你必須保證每個類都在它自己的文件中。但無論如何,這是保持一切整潔乾淨的好方法。

+0

那麼,你是說即使我在使用它們之前包含了我需要的每個文件和依賴項,由於我包含它們的順序,仍然可能存在問題? – TaylorOtwell 2010-08-11 13:39:15

+0

是的,並跟蹤你的所有包括是很煩人的。自動加載還可以提高性能,因爲它只加載腳本實際需要的內容。加載PHP文件通常是一個I/O操作,其速度非常慢。 – selfawaresoup 2010-08-11 16:27:14

0

只需在他們需要之前包括他們,一切都會好起來的。

0

重要的是,如果一個類試圖使用另一個尚未解析的類,那麼就會發生錯誤。最好的選擇是將這些類放在腳本中,這樣依賴性將保持不變。

-1

如果它們全都在同一個文件中,那麼這個順序不應該有問題。有一些罕見的例子(我已經看到命名空間)順序很重要,但除非你推動信封,否則不要太擔心。

試試吧。可能發生的最糟糕的是它會給你一個錯誤...

2

在1個PHP文件中,你可以在任何地方聲明函數/類並在任何地方調用它們(在該文件中),順序無關緊要。

至於包含,您必須在您嘗試使用該文件中聲明的函數/類之前包含文件。

+0

將所有內容保存在一個文件中對於小型項目來說可能看起來很舒服,但它禁止您重複使用部分軟件,並且必須始終加載全部內容,即使您並未實際使用所有類/函數。這對性能來說是相當大的浪費。 – selfawaresoup 2010-08-11 16:29:07

+0

如果您使用的是自動裝載器,則包含多個類的文件需要按層次順序排列這些類。否則,你會有錯誤。 – 2015-05-10 02:55:28

-1

是的,這很重要,當涉及大量的類時,它可能會導致問題。如果您的生產腳本需要包含40或50個班級,則使用自動加載不可行,如果您的應用程序按照最佳的面向對象操作規範進行了適當設計,並且您需要處理表格等,則始終會出現這種情況...

讓我解釋爲什麼這個命令很重要。如果您使用自動加載器,每次找到關鍵字擴展時,都會嘗試自動加載一個類。因此,如果在擴展類被定義之前擴展,它將觸發自動加載事件。

當您開發您的應用程序時,請使用自定義自動加載器。使該自定義自動加載器爲您提供有關使用的時間和內存的信息。它會逐個加載所有類文件,並浪費大量時間。當您的應用程序完成後,您可以通過將許多相關類集中到一個文件中進行優化。例如,我的表單類在class.form.php中,它不只是加載表單類。它會加載另外50個與表單相關的類。因此,我將所有內容都放在一個文件中,當我創建一個新的form()時,自動加載器會加載class.form.php,其中包含表單通常需要的其他類(form_checkbox,form_input等),因此當它們需要時,它們不是自動加載器,因爲它們已經被定義。

您可以創建一個PHP腳本,它將遞歸,解決依賴關係,並在單個類文件(class.form.php,使用我的示例)中排列所有類,以便它們都具有在extends關鍵字之前定義的父類這觸發了自動加載)被發現。我在連接文件上運行php -w,該文件除去註釋和空格。它將我的表格班從80K減少到18K。每當我使用一個表單時,我創建一個新的表單(),並且它加載了18K的值得表單相關的類,這並不過分。

最初我使用了linux命令cat,但它不起作用。您需要一個更智能的腳本,可以解析每個擴展類的父級,並在包含許多相關類的文件中正確排序類。

+0

這似乎是你想要手動做,[OPCache](http://php.net/manual/en/intro.opcache.php)會自動執行。 – 2015-06-29 00:14:02