【发布时间】:2009-01-04 16:48:19
【问题描述】:
精通PHP但学习Java的人应该知道的PHP和Java之间的主要区别是什么?
编辑:我的意思是语言的语法差异,即它们的数据类型,它们如何处理数组和引用变量等等:)
【问题讨论】:
-
你是怎么开始回答这个问题的?这就像在问,“西班牙语和葡萄牙语有什么区别?”
精通PHP但学习Java的人应该知道的PHP和Java之间的主要区别是什么?
编辑:我的意思是语言的语法差异,即它们的数据类型,它们如何处理数组和引用变量等等:)
【问题讨论】:
不是一个详尽的列表,我是一名 PHP 开发人员,不久前曾参观过 Java,所以 Caveat Emptor。
Java 中的每个变量都需要预先添加一个数据类型。这包括基本类型,如 boolean、int、double 和 char,以及 Object 数据类型,如 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){
println("True");
}
else{
println("False");
}
数组是经典的 C 数组。只能保存一种特定类型的变量,需要创建固定长度
为了解决这个问题,有一系列集合对象,其中一个名为 ArrayList 的行为更像 PHP 数组(尽管持有一种类型的业务仍然如此)。你不会得到类似数组的语法,所有的操作都是通过方法完成的
//creates an array list of strings
ArrayList<String> myArr = new ArrayList<String>();
myArr.add("My First Item");
ArrayLists 仍然有数字键。还有另一个名为 HashMap 的集合,它会给你一个字典(或关联数组,如果你在 90 年代上过学的话),就像对象一样。
ArrayLists 和其他集合是使用泛型(
Java 没有指针。但是,所有对象实际上都是引用,类似于 PHP 5,与 PHP 4 不同。我不认为 Java 具有(已弃用的)PHP &reference &syntax。
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 要求使用一个显式的 $this。 Java(如上例所示)没有。
Java 程序往往是通过“程序运行、保持运行、处理请求”的方式构建的,而 PHP 应用程序是通过“运行、处理请求、停止运行”的方式构建的。
【讨论】:
if (string1 == string2),它经常返回错误。改用if (string1.equals(string2) 会好很多
我认为这两种语言(以及它们的运行时系统)差别太大,无法一一列举。我想到了一些非常大的东西:
到时候你会注意到大多数差异,但最重要的是:
【讨论】:
=== 和 !== 这样的运算符的原因。 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)。关联数组按插入顺序排序,可以像普通数组一样使用(在值上)。在 Java 中有一个 Map 实现维护插入顺序,但这是例外而不是规范;$arr['foo'] = 'bar' 在关联数组中插入或更新元素。 Java 必须使用Map.put() 和Map.get();create_function()); 5.3 在语言级别引入了闭包。 Java 必须对两者都使用内部类,这有点冗长。此外,内部类在从外部范围访问变量的方式上受到限制(请参阅 JavaPapers 上的 Java Closures),这使得它们不如真正的闭包强大。global 关键字;register_globals()),否则会自动生成同名的全局变量。它们也可以通过$_POST 全局变量(和$_SESSION 用于会话变量)来访问,而对这些东西的支持来自一个名为servlets API 的JEE 附加组件,通过HttpServletRequest 和HttpSession 等对象;李>
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 工具在您的软件上自动生成文档。但是需要具体的写cmets。
你不能在手机上运行 PHP :) 有很多运行时环境和平台。这意味着您需要提前考虑可能缺少哪些库或可能存在哪些限制(屏幕大小、内存限制、文件路径分隔符“/”或“\”,例如)。
【讨论】: