【问题标题】:What are the differences between PHP and Java?PHP和Java有什么区别?
【发布时间】:2009-01-04 16:48:19
【问题描述】:

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

编辑:我的意思是语言的语法差异,即它们的数据类型,它们如何处理数组和引用变量等等:)

【问题讨论】:

  • 你是怎么开始回答这个问题的?这就像在问,“西班牙语和葡萄牙语有什么区别?”

标签: java php


【解决方案1】:

不是一个详尽的列表,我是一名 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 程序员,所以我对泛型的了解只是它们描述了对象将操作的事物的类型。那里还有很多事情要做。


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

【讨论】:

  • 我不明白字符串有什么不直观的地方。在您的示例中,"foo" != "bar" 语义是按引用还是按值。
  • 你也不应该有。两个 vars 字符串应该是相同的,我太着急了。感谢您了解这一点。
  • 在您的第一个字符串相等示例中,v1==v2 通常为真。当使用字符串的 Java 语法糖 (String v1 = "foo") 创建 String 对象时,这些字符串通常是 intern 的,因此 v1==v2 将引用同一个对象。 OTOH,如果你有 String v2 = new String("foo"),
  • Java 可以做混合类型的集合。所有类都继承自 Object,因此可以创建对象列表(默认)。此外,Java 将其称为泛型,而不是模板。模板是 C++ 术语(也许还有其他术语)。
  • 仅供参考,以我的经验,它太不可靠,无法依赖if (string1 == string2),它经常返回错误。改用if (string1.equals(string2) 会好很多
【解决方案2】:

我认为这两种语言(以及它们的运行时系统)差别太大,无法一一列举。我想到了一些非常大的东西:

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

到时候你会注意到大多数差异,但最重要的是:

  • PHP 提供 OOP(面向对象编程)作为大多数项目中忽略的选项。 Java 要求您以 OOP 方式编程,但是在以不太 OOP 语言的背景学习 Java 时,很容易把事情搞砸并以错误的方式使用 OOP(或者您可能将其称为次优方式或低效的方式...)。

【讨论】:

  • 我不得不承认,我的 PHP 经验太早了,无法对这个特定问题给出明智的答案。我想其他人会留下答案。
  • 请注意,PHP 并不是严格“解释”的。从 PHP 4 开始,对于 PHP 页面/脚本的每个请求,解析器都会生成字节码(通常称为 optcode),然后由 Zend 引擎执行。
【解决方案3】:
  • 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)。关联数组按插入顺序排序,可以像普通数组一样使用(在值上)。在 Java 中有一个 Map 实现维护插入顺序,但这是例外而不是规范;
  • $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 用于会话变量)来访问,而对这些东西的支持来自一个名为servlets API 的JEE 附加组件,通过HttpServletRequestHttpSession 等对象;李>
  • 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 字符串常量都使用双引号,并且没有这样的变量求值;
  • PHP 对象方法调用使用-&gt; 运算符。 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()
  • 毫无疑问还有更多,但这就是我现在想到的全部内容。

【讨论】:

  • 不同意或不同意,但我很好奇您所说的“方法覆盖和重载在 Java 中很自然,但在 PHP 中有点杂乱无章;”是什么意思。除非我遗漏了什么,否则这两种语言都允许孩子声明新方法来覆盖父类中存在的方法。
  • @Alan,是的,但是在 PHP 中,如果一个类有两个同名的函数或者有两个同名的过程函数,你会得到一个 T_FUNCTION_EXISTS 或类似的错误
【解决方案4】:
  • 您可以使用JavaDoc 工具在您的软件上自动生成文档。但是需要具体的写cmets。

  • 你不能在手机上运行 PHP :) 有很多运行时环境和平台。这意味着您需要提前考虑可能缺少哪些库或可能存在哪些限制(屏幕大小、内存限制、文件路径分隔符“/”或“\”,例如)。

【讨论】:

  • 您可以使用 phpDocument 或 phpdoc.org 与 PHP 相同。部分手机有非标准Java版本。
猜你喜欢
  • 2017-01-10
  • 2018-11-18
  • 2011-06-02
  • 2010-09-19
  • 1970-01-01
  • 2016-03-20
  • 2012-03-08
  • 2011-03-10
相关资源
最近更新 更多