PHP和Java有什么区别?

时间:2009-01-04 16:48:19

标签: java php

熟悉PHP但学习Java的人应该知道PHP和Java之间的主要区别是什么?

编辑:我的意思是语言的语法不同,即他们的数据类型,他们如何处理数组&参考变量,等等:)

4 个答案:

答案 0 :(得分:46)

不是一个详尽的列表,而且我是一名PHP开发人员,他曾在一段时间内参观了Java,因此我发现了这一点。

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和其他集合使用称为泛型(&lt; String&gt;)的东西实现。我不是Java程序员,所以我对Generics的理解是他们描述了Object将要运行的东西的类型。还有更多的事情要发生。


Java没有指针。但是,所有对象实际上都是引用,类似于PHP 5,与PHP 4不同。我不认为 Java具有(折旧的)PHP&amp; reference&amp;语法。


所有方法参数都是通过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中的变量名不以sigil($)开头,但我认为如果你想要它们就可以


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应用程序是从“运行,处理请求,停止运行”的方式构建的。

答案 1 :(得分:14)

我认为这两种语言(以及它们的运行时系统)太不同了,无法列出所有差异。一些非常重要的问题出现在我的脑海中:

  • Java被编译为字节码,PHP被解释(正如Alan Storm指出的那样,自PHP 4以来,它不是,但它仍然表现得好像);
  • Java是强大且静态类型的,而PHP则是相当弱的动态类型;
  • PHP主要用于动态生成网页。 Java也可以做到这一点,但也可以做任何其他事情(如Applets,手机软件,企业产品,有和没有GUI的桌面应用程序,3D游戏,Google Web Toolkit ......);和
  • 在此处添加您最喜欢的差异

你会发现大部分时间差异,但最重要的是:

  • PHP提供OOP(面向对象编程)作为在大多数项目中被忽略的选项。 Java要求你编写OOP方式,但是当用不那么OOP语言的后台学习Java时,很容易弄乱并以错误的方式使用OOP(或者你可能称之为次优的方式)或效率低下的方式......)。

答案 2 :(得分: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)。关联数组按插入顺序排序,可以像普通数组一样使用(在值上)。有一个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)访问它们,而对这些内容的支持来自通过HttpServletRequest等对象调用servlet API的JEE加载项。 HttpSession;
  • 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中有点像kludge;
  • PHP代码嵌入在主要是HTML文档的内容中,就像JSP的工作原理一样;
  • PHP使用.运算符追加字符串。 Java使用+;
  • Java 5+方法必须使用省略号(...)明确声明可变长度参数列表。所有PHP函数都是可变长度的;
  • 可变长度参数列表在方法体内被视为数组。在PHP中,您必须使用func_get_args()func_get_arg()和/或func_num_args();
  • 毫无疑问更多,但这就是现在所想到的一切。

答案 3 :(得分:1)

  • 您可以使用JavaDoc工具自动生成软件文档。但是你需要以特定的方式写评论。

  • 你无法在手机上运行PHP :) 有很多运行时环境和平台。这意味着您需要事先考虑哪些库可能丢失或可能存在哪些限制(屏幕大小,内存限制,文件路径分隔符“/”或“\”等)。