2011-12-24 52 views
4

可能重複:
OOP vs Functional Programming vs Procedural面向對象編程與程序編程 - 最大的區別是什麼?

最近我一直被引入到面向對象方法,到目前爲止,我一直在使用功能一直在寫PHP。

現在,說實話,我並沒有真正明白它: 當我使用「函數」的想法時,我只包含一個名爲例如functions.php的文件,其中包含我需要的所有函數,包括變量,當我需要使用這段代碼時,我只需調用它並設置變量,如果有默認變量,則將其保留爲空。

現在據我所知,OO不是寫很多沒有'category'的函數,而是把它們聚集在一個'class'中(例如,所有使用db的函數都在' db'class) - 而不是給他們增加變數,我在班上宣佈這些變數。

所以,感覺就像我基本上做同樣的事情。我知道瓦爾不是全局的OOP,和他們每個實例,這是使更多的瞭解,能夠代碼行,但除此之外,我真的不能感覺到一個很大的區別做:

$html = new html(); 
$html->src='http://stackoverflow.com'; 
$html->desc='Great place to learn & share knowledge'; 
$html->link(); 

-

html_link('http://stackoverflow.com','Great place to learn & share knowledge'); 

我同意,這可能是人誰不寫代碼的可讀性,但看不到很大的好處大家都在談論:重用,組織,速度更快等。

分享您的想法,也許我會明白我怎麼可以從OOP :)提前

感謝, 伊克受益。

+3

您不需要意思是「功能性」,你的意思是「程序性」。功能是相當不同的(想想Lisp)。 – 2011-12-24 14:35:26

+0

如果你問我,PHP的「面向對象」支持很大程度上是作爲一種事後的追求。如果您覺得它有用,請使用它,但是當語言的某些方面感覺人爲的,沒有想到的或簡單的莫名其妙時,請不要感到驚訝。 – 2011-12-24 14:36:05

+2

如果您只是使用類作爲名稱空間來分組函數,那麼它不是真正的OOP。 – JohnP 2011-12-24 14:36:21

回答

0

OOP的基本本質是,你有功能(方法)和數據(屬性)在一個地方,類/對象。 當你只寫函數和使用變量都是分開的。

注意:函數式編程不是您現在所做的。有一個範例functional programming其中諸如循環的結構不存在,並且所有內容都在函數中表示。

0

當你所做的只是編寫簡單的函數而不保留任何上下文等時,程序編程就容易得多。

一旦你想使用兩個具有完全相同參數的函數,使用對象會更容易,因爲它將需要更少的代碼。

下面的例子假設你有一個網站(SO)並且想要爲單獨的頁面創建URL。您需要在一箇中心位置定義「基本位置」,以避免在域更改後不得不重寫所有頁面。

$url = new URL('http://stackoverflow.com'); 
echo $url -> link('home'); // http://stackoverflow.com/home 
echo $url -> link('review'); // http://stackoverflow.com/review 

做與功能:

echo linkURL('http://stackoverflow.com', 'home'); 
echo linkURL('http://stackoverflow.com', 'review'); 

正如你所看到的,你甚至可能不會都不屑於使用的功能。

然後是預OO方法是:同時還具有背景

$context = prepareURL('http://stackoverflow.com'); // returns <something> 
echo createURL($context, 'home'); 
echo createURL($context, 'review'); 

這種方法使用的功能。但是,正如您可能已經注意到的,這與OO非常接近。

2

閱讀關於多態性。一旦你明白了這一點,你就到了一半。一個類不僅僅是一個函數的集合(oo speak中的方法),一個類的一個實例封裝了狀態和行爲。你也應該研究設計模式,以充分實現oo範式的力量。從四人幫(http://en.m.wikipedia.org/wiki/Design_Patterns)開始,並且還可以促進企業模式(http://martinfowler.com/articles/enterprisePatterns.html)