2010-10-13 56 views
3

PHP5引入了一個面向對象的文件包裝器,SplFileObject。我想我只是發現爲什麼幾乎沒有人使用它。它純粹是面向行的,沒有fread()方法 - 對應的frwite似乎暗示了這一點。用fread方法擴展SplFileObject

所以現在我想知道我是否可以擴展它。但我不確定什麼是更好的解決方法。 SplFileObject在將文件指針($ fp)分開時不是特別有用 - 它是私有屬性或ZE內部資源。那麼如何擴展它以獲得fread方法?

  • 如果請求只是一個特定的大小和與fgets讀太遠,直到下一個\ n換行符實現FREAD()爲()字符串收集環用於fgets,與最終的追求。
  • 使用自定義構造函數,該函數第二次打開文件並存儲輔助文件指針,以防我想調用fread()而不是父類方法。

我會去fgets解決方案循環,但它聽起來很繁瑣和緩慢,並提供更多的潛在隱患。 OTOH打開輔助文件指針似乎不是一個好方法,也需要一個自定義析構函數。

+0

你需要什麼'FREAD()'呢? – rojoca 2010-10-13 21:39:02

+0

讀取整個文件。只是想傳遞一個文件對象來獲得它的元信息。 – mario 2010-10-13 21:48:45

+1

在這種情況下,只需添加一個調用'file_get_contents($ this-> getPathname());'的方法。如果你想能夠使用'fread',最好是定義你自己定製的類,它可以使用文件處理函數來實現你需要的所有功能。 – rojoca 2010-10-13 22:07:50

回答

5

您可以調用擴展方法並添加一個fread方法,該方法重複調用fgetc方法所需的次數。

這就是說,我同意這是一個奇怪的限制。提交feature request。如果我沒有遺漏某些東西,那麼應該實施fread方法。

+0

是的,我猜fgets的解決方法是更好的方法。 - 在php.net上確實發現了一個開放的bug /功能請求,2006年有一些關於'SplBinaryFileObject'的思考,似乎沒有實際的計劃來添加它。 – mario 2010-10-14 10:05:29