2009-01-04 114 views
22

PHP和Java之間的主要區別是,有人熟練使用PHP,但學習Java應該知道些什麼?PHP和Java有什麼區別?

編輯:我指的是在語言的語法差異,即它們的數據類型,它們是如何處理數組&引用變量,等等:)

+2

你甚至開始回答這個問題?這就像問:「西班牙語和葡萄牙語之間有什麼區別?」 – 2010-02-18 05:31:32

回答

45

不是一個詳盡的列表,而且我是PHP開發人員,他在Java中做了一次巡視,以便重新關注Caveat Emptor。

Java中的每個變量都需要預先加上數據類型。這包括基本類型,如布爾,整型,雙和炭,以及對象數據類型,例如ArrayList,String和自己的對象

int foo = 36; 
char bar = 'b'; 
double baz = 3.14; 
String speech = "We hold these truths ..."; 
MyWidget widget = new MyWidget(foo,bar,baz,speech); 

每個變量只能持有的價值它的類型。使用上面的聲明,下面是無效

foo = baz 

平等上的對象(未在原始類型)檢查對象的身份。所以下面不直觀地打印錯誤。字符串有一個平等的方法來處理這個問題。

//see comments for more information on what happens 
//if you use this syntax to declare your strings 
//String v1 = "foo"; 
//String v2 = "foo"; 

String v1 = new String("foo"); 
String v2 = new String("foo"); 

if(v1 == v2){ 
    pritnln("True"); 
} 
else{ 
    println("False"); 
} 

數組是你的經典C數組。只能容納一個特定類型的變量,需要用一個固定長度


爲了解決這個問題創造,有一系列集合對象,其中一個被命名的ArrayList,將採取更喜歡PHP陣列(儘管持有一類業務仍然如此)。你不會得到像語法的陣列,所有的操作都通過方法來完成

//creates an array list of strings 
ArrayList<String> myArr = new ArrayList<String>(); 
myArr.add("My First Item"); 

的ArrayList還有數字鍵。還有另一個名爲HashMap的集合,它會爲你提供一個字典(或者如果你在90年代上學的時候是關聯數組),就像對象一樣。


的ArrayList等集合利用所謂的仿製藥(在<字符串>)來實現。我不是一個Java程序員,所以我對泛型的理解是他們描述了一個對象的操作類型。那裏還有更多。


Java沒有指針。但是,所有對象實際上都是引用,類似於PHP 5,與PHP 4不同。我不想認爲 Java具有(折舊)PHP &引用&語法。


所有方法參數都通過Java傳遞值。但是,由於所有對象都是實際引用,因此在傳遞對象時傳遞引用的值。這意味着如果你操縱一個傳入方法的對象,操作將會持續下去。但是,如果你嘗試這樣的事情,你不會得到結果,你希望

public void swapThatWontWork(String v1, String v2) 
{ 
    String temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

它的好時候任何一提的是方法,需要指定其返回類型有,壞的事情如果一個方法返回它不應該的東西,將會發生。如果一個方法是要拋出一個異常,下面的方法返回一個int

public int fooBarBax(int v1){ 
} 

,你必須把它作爲申報等,或編譯器不會有什麼關係呢。

public int fooBarBax(int v1) throws SomeException,AnotherException{ 
    ... 
} 

如果你使用你沒有在你的方法寫的對象可能會拋出異常這可能很麻煩。


您在Java主代碼切入點將是一個類的方法,而不是PHP的全球主要切入點


變量名在Java中不使用印記開始($) ,但我認爲他們可以,如果你想他們


Java中的類名是區分大小寫的。


字符串在Java中不可變,所以級聯可能是一個昂貴的操作。


Java類庫提供了一種實現線程的機制。 PHP沒有這樣的機制。


PHP方法(和函數)允許您有可選參數。在Java中,你需要定義的參數

public function inPHP($var1, $var2='foo'){} 

public void function inJava($var1){ 
    $var2 = "foo"; 
    inJava($var1,$var2); 
} 
public void function inJava($var1,$var2){ 

} 

PHP需要一個明確的$當一個對象調用自己的方式方法,這可以使用每個可能的列表中選擇一個單獨的方法。 Java(如上例所示)不會。


Java程序往往是從內置「程序運行時,保持運行,處理請求」的方式的一種方式,那裏的PHP應用程序從一個內置「運行,處理請求,停止運行」樣。

+0

我不明白什麼是字符串不直觀的。在你的例子中,「foo」!=「bar」語義是按引用還是按值。 – Alan 2009-01-04 22:20:13

14

我認爲這兩種語言(以及他們的運行時系統)太差,無法列出所有的差異。一些非常大的浮現在我的腦海:

  • 的Java編譯成字節碼,PHP解釋(如艾倫風暴指出,由於PHP 4,它不是,但它仍然表現爲如果它是);
  • Java強大而且是靜態類型的,而PHP是相當弱和動態類型的;
  • PHP主要用於動態生成網頁。 Java也可以做到這一點,但也可以做其他任何事情(如Applets,手機軟件,企業內容,帶或不帶GUI的桌面應用程序,3D遊戲,Google Web Toolkit ...);和
  • 添加自己喜歡的區別就在這裏

你會發現大多數的差異時,它的時間,但什麼是最重要的:

  • PHP提供了OOP(面向對象編程)作爲一個選項這在大多數項目中被忽略。 Java需要你編寫OOP方式,但是當以非OOP語言的背景學習Java時,很容易混淆並以錯誤的方式使用OOP(或者你可能稱之爲次優方式或者效率低下的方式......)。
+0

請參閱編輯並澄清如果可能:) – 2009-01-04 18:30:47

+0

我不得不承認,我的PHP經驗太早,無法給出具體問題的明智答案。我猜別人會留下答案。 – 2009-01-04 18:38:18

+0

只是一個簡短的說明,PHP不是嚴格「解釋」。自PHP 4以來,每次請求PHP頁面/腳本時,解析器都會生成字節碼(通常稱爲optcode),然後由Zend Engine執行。 – 2009-01-04 20:01:55

6
  • Java是強類型的。 PHP不是;
  • PHP做了很多隱式類型轉換,這實際上可能有問題,並且爲什麼PHP5有像===!==這樣的操作符。 Java的隱式類型轉換主要限於原始類型的自動裝箱(PHP沒有原始類型)。這經常出現。

考慮:

$val = 'a'; 
if (strpos('abcdefghij', $val)) { 
    // do stuff 
} 

這是不正確的,將具有不執行塊由於0返回指數被轉換爲false。正確的版本是:

$val = 'a'; 
if (strpos('abcdefghij', $val) !== false) { 
    // do stuff 
} 

Java條件語句需要明確的boolean;

  • PHP變量和數組全部由$前綴,否則難以區分;
  • PHP關聯數組的等價物是PHP Maps(例如HashMap)。關聯數組按照插入順序排序,可以像普通數組一樣使用(在值上)。 Theres one Map在Java中維護插入順序的實現,但這是例外而非標準;
  • $arr['foo'] = 'bar'插入或更新關聯數組中的元素。 Java必須使用Map.put()Map.get();
  • PHP5具有等價的函數指針和匿名函數(使用create_function()); 5.3在語言層面引入閉包。 Java必須爲兩者使用內部類,這有點更加冗長。此外,內部類限制了它們如何從外部範圍訪問變量(在JavaPapers上閱讀Java Closures),使得它們不如真正的閉包強大。
  • 變量聲明在PHP中是可選的;
  • 在函數中使用全局變量需要明確使用PHP中的global關鍵字;
  • POST/GET參數是,除非另有配置(register_globals())會自動生成具有相同名稱的全局變量。他們也可以通過$_POST全局變量(而會話變量爲$_SESSION)訪問,而對於這些東西的支持來自JEE附加組件,通過對象如HttpServletRequestHttpSession對象稱爲servlet API;
  • PHP中的函數聲明使用function關鍵字,而在Java中聲明返回類型和參數類型;
  • PHP函數名稱通常不會發生衝突,而只要不同的方法簽名不明確,Java就允許方法重載;
  • PHP有函數參數的默認值。 Java沒有。在Java中,這是使用方法重載實現的。
  • PHP支持missing-method模式,這在PHP文檔中被混淆地稱爲「overloading」。

比較:

function do_stuff($name = 'Foo') { 
    // ... 
} 

void doStuff() { 
    doStuff("Foo"); 
} 

void doStuff(String what) { 
    // ... 
} 
  • 字符串常量在PHP中使用單或雙引號聲明,很像Perl的。雙引號將評估嵌入在文本中的變量。所有的Java String常量都使用雙引號,並且沒有此類變量評估;
  • PHP對象方法調用使用->運算符。 Java使用.運算符;
  • Java中的構造函數以類名命名。在PHP中,它們被稱爲__construct();
  • 在Java對象中,this是隱含的,僅用於明確範圍,並且在某些情況下用於內部類。在PHP5中,$this是明確的;
  • Java中的靜態方法可以通過一個實例上的.運算符來調用(雖然不鼓勵它在語法上有效),但通常使用類名來代替。

這兩個是相同的:

float f = 9.35f; 
String s1 = String.valueOf(f); 
String s2 = "My name is Earl".valueOf(f); 

但前者是優選的。 PHP使用::作用域分辨率算子進行靜態分析;

  • 方法覆蓋和重載在Java中很自然,但在PHP中有點混亂;
  • PHP代碼嵌入在其他主要是HTML文檔中,很像JSP如何工作;
  • PHP使用.運算符來追加字符串。 Java使用+;
  • Java 5+方法必須使用省略號(...)來顯式聲明可變長度參數列表。所有PHP函數都是可變長度的;
  • 變長參數列表在方法體內被視爲數組。在PHP中,您必須使用func_get_args()func_get_arg()和/或func_num_args();
  • 毫無疑問更多,但這是所有現在想到的。
1
  • 你可以使用JavaDoc工具在您的軟件自動生成的文檔。但是你需要以特定的方式寫評論。

  • 你不能在手機上運行PHP: 有很多運行時環境和平臺。這意味着您需要事先考慮哪些庫可能會丟失或可能存在哪些限制(屏幕大小,內存限制,文件路徑分隔符「/」或「\」等)。