2012-02-23 85 views
4

現在我已經用PHP寫了半年多了,雖然我還有很長的路要走,但我可以很容易地解決問題,併爲我需要的任何內容創建腳本。我來自面向對象的背景,這是PHP似乎很少使用它的默認庫。爲什麼PHP不在其默認庫中使用對象?


大多數外部庫我使用或創建,使用面向對象的設計,而默認似乎使用下一個示例。我將使用文件/寫入讀取過程爲例:

$file_path = "/path/to/file.txt"; 
$file_handle = fopen($file_path, "w+"); 
$content = fread($file_handle, filesize($file_path)); 
fclose($file_handle); 

現在對我來說,它將使更多的意義來使用的設計,看起來是這樣的:

$file_handle = new FileStream("/path/to/file.txt"); 
$content = $file_handle->read(); 
$file_handle->close(); 

現在我確信這背後會有一個明確的推理,因爲同樣的想法被應用於字符串,數組,cURL,MySQL查詢等等。我很想知道它是什麼。

因此,如果最好編寫以句柄或資源作爲第一個參數的獨特函數,例如

object_method($handle, $value); 

那麼爲什麼最流行的(外部)PHP庫傾向於使用:

$object->method($value); 

和我應該寫我自己的庫和應用程序時使用?

+1

因爲PHP中的OOP是相對較新的,並且在後來的5.x版本中才變得有用。 PHP有一個** LOT **的舊行李拖動。 – 2012-02-23 19:20:31

+0

不能爲作者說話,但我的猜測是遺留原因;如果有效,不要打破它。 – 2012-02-23 19:20:45

+0

不是S.O類型的問題。 – 2012-02-23 19:20:50

回答

1

PHP直到最近還不是OOP語言。

real OOP只出現在v5.x中;所有的舊功能都是爲了向後兼容的原因而留下的,爲什麼在老的時候發明新的功能運行良好?

也就是說,對於一些圖書館來說,有OOP替代品;例如有一個PDO庫,它取代了傳統的過程風格mysql庫。

1

PHP最初是作爲向HTML頁面添加動態文本的簡單方式編寫的,而不是一種正式定義良好的OO語言。直到PHP 5 OO非常有限。 Zend(PHP的創建者和維護者)希望確保高度的向後兼容性,因爲大部分Web運行在PHP上。

越來越多的功能通過每個新版本獲得官方的OO包裝類,有些通過pecl或pear附加。好的做法是儘可能使用OO版本。

我懷疑我們是否會看到100%的PHP到Java的程度。

0

我確信向後兼容性將en在某個地方進入等式。即使核心php開發人員認識到他們的「錯誤」由於PHP被廣泛實現,所以很難撤消它。日期函數和DateTime類是一個很好的例子,它嘗試在不破壞升級路徑的情況下提高其使用率PHP

+0

爲什麼downvote? – 2012-02-23 19:40:02

1

即使我能理解你的問題的一部分,你給出的例子實際上有點誤導,因爲那部分是在對象面向PHP,見SplFileObject,朋友們:

$file = new SplFileObject("/path/to/file.txt"); 
$content = ''; 
foreach ($file as $line) 
    $content .= $line; 

有更像是整個SPLDOMDocumentDateTimeIntlPDO等等等等。

+0

我只舉了一個例子來說明我的意思是使用帶有句柄參數的函數。 – 2012-02-23 19:26:14

+0

不是所有的東西都必須是面向對象的,你給的句柄示例經常用在允許引用「對象」的過程代碼中。但是自從5/5以來,PHP發生了很大的變化。2,你現在可以找到越來越多的面向對象的接口。許多圖書館都有[Tidy](http://php.net/Tidy),但也有其他圖書館,例如[GMP](http://php.net/GMP)。 – hakre 2012-02-23 19:31:11

+0

面向對象(除其他外)是一個自動將對象作爲第一個參數傳遞給函數的包裝器,並將其稱爲'this'。 – 2012-02-23 20:32:46

1

好吧,我在這方面的專家,但我會提供我的$ .02猜測反正:

PHP和web開發一般,是一個相對較新的範例。 C#是基於什麼,40年的工作? PHP開始於1995年。

PHP可以完全OO,但編程的Web服務器是一個自然程序化的環境 - 服務器接收HTTP請求,它會進行一些處理,它會回覆。你可以從這個方面抽象出來,但是它一直是個好主意嗎?

Web服務器環境中的許多任務並不需要OO--它在大型項目中很好,但有多少個站點只使用一對字符串處理函數和include()?也許郵件()?

PHP是爲提高速度而構建的,可以在輕量級服務器上運行,重點是字符串處理而不是高級數學等。不要引用我的意思,但是我認爲如果你嚴格遵守基本類的OO,可能會招致一些性能開銷。

無論如何,我不是專家,但這是我的想法:)至少應該考慮一下。

+2

這似乎回答了這個問題:「PHP的內置庫應該是面向對象的嗎?」而不是「爲什麼PHP的內置庫不是面向對象的?」 – 2012-02-23 20:32:38

+0

那麼,如果你可以合理地認爲PHP是非設計的面向對象的,那麼它們幾乎是同一個問題。我的意思是,獲得明確答案的唯一方法就是問Zend,我只是提供了他們推動PHP發展的邏輯的猜測。 – siliconrockstar 2012-02-23 21:55:54

相關問題