2013-05-06 89 views
8

首先,這是一個很長的一個,所以感謝您的閱讀。PHP 5.4 vs 5.3:在同一文件中自動加載多個類

我的問題是類似這樣的: Class not found in the same file

我有一個定製的框架,最初寫於2008年的PHP 5和它已經升級多年來與PHP 5.3的工作。我一直在尋求5.4的兼容性,並遇到了嚴重的問題。

ORM層自動爲每個數據庫表生成類。這些類全部放在每個表的一個文件中,我們的自動加載器在需要時加載該文件。 例如,「公共」模式(postgresql)中的'customer'表將具有以下類: PublicCustomer,PublicCustomerDBReader,PublicCustomerDBWriter。 現在這可能不是理想的設置,但它是我們目前擁有的。

在PHP 5.3中,如果需要PublicCustomer,則文件將被包含,解析並且所有上述類都可用。因此,例如,如果在PublicCustomer上調用靜態方法,並且該方法在PublicCustomerDBReader中調用了某些內容,則該方法可以正常工作,因爲該類位於同一個文件中。

在PHP 5.4中,它看起來像是在覈心中進行了一些優化。在上面的場景中:

  1. 在PublicCustomer中調用一個靜態方法。

  2. 自動加載器查找並加載正確的文件。

  3. PHP解析器只解析它所需的位置; PublicCustomer類。它沒有解析或實例化PublicCustomerDBReader類。我可以通過測試該類是否存在以及通過查看解析器是否在達到文件結束時(即該方法被調用時)來確認此事。

  4. 然後PublicCustomer中的方法嘗試調用PublicCustomerDBReader中的方法。這失敗了,因爲我們的自動加載器已經需要一次文件。

在我看來,我有兩個解決方案:

  1. 分開這些班列,以便有針對每一個文件(這將產生的文件數量巨大)
  2. 重新設計ORM層,因此不需要多個類。

我是否理解了上述問題?

有誰知道是否在PHP 5.4中進行了優化或更改會導致此行爲?

有沒有其他可能的解決方案來解決我沒有考慮過的問題?

+2

你應該使用方法1.你有多少班?它不應該是很多工作。 PHP自動加載器基於與classnames \ namespaces相關的文件名\目錄。 PHP中沒有內置的包支持。無論如何,它應該讓你的腳本更加模塊化。爲什麼當只需要class2時,應用程序將不得不解析class1和class2? – mpm 2013-05-06 09:05:58

+0

有沒有什麼能夠阻止你以一種爲每個類創建單獨文件的方式修改ORM?這應該很容易解決問題,反正會更好。 ;) – 2013-05-06 09:06:28

+0

我可以將這些類分離爲單獨的文件,但這顯然會增加ORM中文件的數量。每個數據庫表有5個類,所以這會增加5倍的文件數。我管理的一些數據庫有300-400個表,這意味着〜2000個文件。顯然這不是一個很好的設計,我只是想知道如何改變它向前發展。 – user2353938 2013-05-06 10:04:50

回答

1

將讀寫器類放在文件的開頭。你也可以考慮提交一個錯誤報告,因爲解析器只應該停止錯誤。

0

參照PHP Framework Interop Group及其自動加載標準PSR-0PSR-4每個類都必須有自己的文件,名稱以.php結尾。即使你有成千上萬的類,這對文件系統也不是問題。

隨着文件不止一個類,你必須考慮以下幾個方面:

  • 每個類的自動加載必須決定要加載的文件。如果文件中有多個類,則每個使用的類都會導致加載。類文件應該加載一次而不是更多,因爲類不能重新聲明。我不推薦使用它,但是您可以使用自己的自動加載器來處理此問題,該自動加載器會記住已加載的文件或加載的類的測試。
  • 放置在同一個文件中並使用彼此的類是有問題的。該問題在Derived class defined later in the same file 「does not exist」?answered by Jon中描述。