2012-10-21 55 views
1

我剛剛開始學習PHP。對不起,如果這是一個新手問題,但我想知道方法如何工作。例如,如果我想刪除字符串開頭的空格。在Ruby中,我會打電話是這樣的:PHP和Ruby中的方法之間的差異

string.strip! 

但在PHP,我會做這樣的事情:

trim(string); 

顯然,Ruby的版本是更優雅(在面向對象的條件設計),但我想知道它如何適用於PHP和其他語言如Java。是否有這樣的設計函數/方法的名稱(在PHP中)?這些方法在哪裏定義,爲什麼可以在任何地方訪問?提前感謝!

+3

PHP並不完全是面向對象的。你可以寫它,但PHP本身不是。有些人喜歡稱它爲對象能力。 * /我鴨子的封面* – PeeHaa

+2

當你看更好的語言時,不要看PHP。 – quantum

+0

@PeeHaa:夠公平的;我收回我的評論:) –

回答

7

這裏有兩種不同的範例:面向對象編程(OOP)和程序編程

在OOP中,函數在數據的上下文中定義,由封裝;這種功能通常稱爲方法。當在一個對象(例如一個類的實例)上調用一個方法時,它本身就可以訪問該對象的狀態。所以,在你的例子中,strip已經知道它被調用的是什麼字符串,所以不需要任何額外的參數。只要你的函數自然地運行在一個特定的對象或一組數據上(例如,strip作用於一個字符串),以這種方式將它定義爲實例方法是明智的。

在過程式編程中,函數是獨立定義數據結構(類),並且必須顯式地傳遞它們要使用的數據。有時這種方法實際上更自然;例如,打印stdout或類似的一些輸入的print函數不是與任何特定對象或數據自然關聯的。

大多數現代語言都內置OO功能,因爲它是一個功能非常強大且功能強大的編程範例。 Java和C#等語言鼓勵所有代碼以面向對象的風格編寫。在這些語言中,即使像字符串和浮點這樣的基本數據類型實際上也是對象,並且有它們自己的方法和狀態。在C#中尤其如此,其中全部類型最終從System.Object(甚至intdouble)繼承,並且繼承了由此定義的所有通用方法。這被稱爲統一類型層次結構

另一方面,PHP具有OOP和程序特徵的奇妙混合;它開始作爲一種程序語言的生活,並且OOP僅在第3版中引入(並且僅在非常基本的意義上)。雖然從PHP5開始,它具有相對較好的OOP支持,但其大部分標準庫仍然在程序上實現爲鬆散的函數集合,這些函數會將相關狀態/數據作爲參數傳遞給它們。OOP庫變得更加普遍,但是(例如與mysqli)。

+0

非常感謝您的詳細解釋。但是,有一個問題,在程序編程中,這些功能究竟是如何組織的?既然他們沒有附加到類,他們是分組到模塊還是他們都只是全球定義?再次感謝。 – maru

+4

取決於語言。在PHP中,它們都默認在全局名稱空間中定義(實際上,直到版本5.3,PHP只有*全局名稱空間)。但是,例如,在Python中,每個模塊都有自己的名稱空間(儘管全局名稱空間中存在一些特殊功能)。 –

+0

這爲我澄清了一些混亂,再次感謝! – maru

2

您正在研究實質方法和類/靜態方法之間的差異。實例方法在類的特定實例上調用,並且可以訪問該實例的內部狀態。類/靜態方法不是,也不是。


我不確定你在詢問「它如何適用於PHP和... Java」。關於實例與非實例方法,Ruby,PHP和Java的工作方式大致相同。

+0

我的意思是,我怎麼能通過直接調用它像trim()而不是像Class.method格式? – maru

+1

因爲PHP不像Java那樣需要將函數綁定到一個類,它只是_allows_。換句話說:這只是語言設計的方式。 Python的工作原理類似函數可以,但不是被強制綁定到類或類的實例。 –