PHP和Java之間的主要區別是,有人熟練使用PHP,但學習Java應該知道些什麼?PHP和Java有什麼區別?
編輯:我指的是在語言的語法差異,即它們的數據類型,它們是如何處理數組&引用變量,等等:)
PHP和Java之間的主要區別是,有人熟練使用PHP,但學習Java應該知道些什麼?PHP和Java有什麼區別?
編輯:我指的是在語言的語法差異,即它們的數據類型,它們是如何處理數組&引用變量,等等:)
不是一個詳盡的列表,而且我是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應用程序從一個內置「運行,處理請求,停止運行」樣。
我不明白什麼是字符串不直觀的。在你的例子中,「foo」!=「bar」語義是按引用還是按值。 – Alan 2009-01-04 22:20:13
我認爲這兩種語言(以及他們的運行時系統)太差,無法列出所有的差異。一些非常大的浮現在我的腦海:
你會發現大多數的差異時,它的時間,但什麼是最重要的:
請參閱編輯並澄清如果可能:) – 2009-01-04 18:30:47
我不得不承認,我的PHP經驗太早,無法給出具體問題的明智答案。我猜別人會留下答案。 – 2009-01-04 18:38:18
只是一個簡短的說明,PHP不是嚴格「解釋」。自PHP 4以來,每次請求PHP頁面/腳本時,解析器都會生成字節碼(通常稱爲optcode),然後由Zend Engine執行。 – 2009-01-04 20:01:55
===
和!==
這樣的操作符。 Java的隱式類型轉換主要限於原始類型的自動裝箱(PHP沒有原始類型)。這經常出現。考慮:
$val = 'a';
if (strpos('abcdefghij', $val)) {
// do stuff
}
這是不正確的,將具有不執行塊由於0
返回指數被轉換爲false
。正確的版本是:
$val = 'a';
if (strpos('abcdefghij', $val) !== false) {
// do stuff
}
Java條件語句需要明確的boolean
;
$
前綴,否則難以區分;Maps
(例如HashMap
)。關聯數組按照插入順序排序,可以像普通數組一樣使用(在值上)。 Theres one Map
在Java中維護插入順序的實現,但這是例外而非標準;$arr['foo'] = 'bar'
插入或更新關聯數組中的元素。 Java必須使用Map.put()
和Map.get()
;create_function()
); 5.3在語言層面引入閉包。 Java必須爲兩者使用內部類,這有點更加冗長。此外,內部類限制了它們如何從外部範圍訪問變量(在JavaPapers上閱讀Java Closures),使得它們不如真正的閉包強大。global
關鍵字;register_globals()
)會自動生成具有相同名稱的全局變量。他們也可以通過$_POST
全局變量(而會話變量爲$_SESSION
)訪問,而對於這些東西的支持來自JEE附加組件,通過對象如HttpServletRequest
和HttpSession
對象稱爲servlet API;function
關鍵字,而在Java中聲明返回類型和參數類型;比較:
function do_stuff($name = 'Foo') {
// ...
}
到
void doStuff() {
doStuff("Foo");
}
void doStuff(String what) {
// ...
}
->
運算符。 Java使用.
運算符;__construct()
;this
是隱含的,僅用於明確範圍,並且在某些情況下用於內部類。在PHP5中,$this
是明確的;.
運算符來調用(雖然不鼓勵它在語法上有效),但通常使用類名來代替。這兩個是相同的:
float f = 9.35f;
String s1 = String.valueOf(f);
String s2 = "My name is Earl".valueOf(f);
但前者是優選的。 PHP使用::
作用域分辨率算子進行靜態分析;
.
運算符來追加字符串。 Java使用+
;...
)來顯式聲明可變長度參數列表。所有PHP函數都是可變長度的;func_get_args()
,func_get_arg()
和/或func_num_args()
;你可以使用JavaDoc工具在您的軟件自動生成的文檔。但是你需要以特定的方式寫評論。
你不能在手機上運行PHP: 有很多運行時環境和平臺。這意味着您需要事先考慮哪些庫可能會丟失或可能存在哪些限制(屏幕大小,內存限制,文件路徑分隔符「/」或「\」等)。
你甚至開始回答這個問題?這就像問:「西班牙語和葡萄牙語之間有什麼區別?」 – 2010-02-18 05:31:32