PHP和Java有什么区别?
PHP和Java之间的主要差异是哪些人精通PHP但学习Java应该知道什么?
编辑:我的意思是语言的语法差异,即它们的数据类型,它们如何处理数组和引用变量,等等:)
这不是一个详尽的列表,而且我是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){ pritnln("True"); } else{ println("False"); }
数组是您经典的C数组。 只能保存一种特定类型的变量,需要使用固定长度创建
为了解决这个问题,有一系列的集合对象,其中一个名为ArrayList,它的行为更像PHP数组(虽然保持一种类型的业务仍然是正确的)。 你没有得到类似语法的数组,所有操作都是通过方法完成的
//creates an array list of strings ArrayList myArr = new ArrayList (); myArr.add("My First Item");
ArrayLists仍然有数字键。 还有另一个名为HashMap的集合,它会像对象一样为你提供一个字典(或关联数组,如果你在90年代上学)。
ArrayLists和其他集合使用称为generics(
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){ }
如果一个方法要抛出exception,你必须声明它,或者编译器不会与它有任何关系。
public int fooBarBax(int v1) throws SomeException,AnotherException{ ... }
如果您使用未在方法中编写的可能引发exception的对象,这可能会变得棘手。
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需要使用显式$。 Java(如上例所示)没有。
Java程序往往是从“程序运行,保持运行,处理请求”的方式构建的,而PHP应用程序是从“运行,处理请求,停止运行”的方式构建的。
我认为这两种语言(以及它们的运行时系统)太不同了,无法列出所有差异。 一些非常重要的问题出现在我的头上:
- Java被编译为字节码,PHP被解释(正如Alan Storm指出的那样,自PHP 4以来,它不是,但它仍然表现得好像);
- Java强大且静态类型,而PHP则相当弱且动态类型化;
- PHP主要用于动态生成Web页面。 Java也可以做到这一点,但也可以做任何其他事情(如Applets,手机软件,企业产品,有和没有GUI的桌面应用程序,3D游戏,Google Web Toolkit ……); 和
- 在这里添加你最喜欢的差异
在适当的时候你会发现大多数差异,但最重要的是:
- PHP提供OOP(面向对象编程)作为一个在大多数项目中被忽略的选项。 Java要求你编写OOP方式,但是当用不那么OOP语言的后台学习Java时,很容易弄乱并以错误的方式使用OOP(或者你可能称之为次优的方式)或效率低下的方式……)。
- 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闭包)方面受到限制,使它们不像真正的闭包那样强大。 - 变量声明在PHP中是可选的;
- 在函数中使用全局变量需要在PHP中明确使用
global
关键字; - 除非另有配置,否则POST / GET参数(
register_globals()
)会自动生成同名的全局变量。 或者可以通过$_POST
全局变量(和$_SESSION
用于会话变量)访问它们,而对这些东西的支持来自通过HttpServletRequest
和HttpSession
等对象调用servlet API的JEE加载项。 - PHP中的函数声明使用
function
关键字,而在Java中,您声明了返回类型和参数类型; - PHP函数名称通常不会发生冲突,而Java允许方法重载,只要不同的方法签名不是模糊的;
- PHP具有函数参数的默认值。 Java没有。 在Java中,这是使用方法重载实现的。
- PHP支持缺少方法模式,在PHP文档中混淆地称为“ 重载 ”。
相比:
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使用::
scope resolution运算符进行静态运算;
- 方法覆盖和重载在Java中是很自然的,但在PHP中却是一个小问题;
- PHP代码嵌入在主要是HTML文档的内容中,就像JSP工作的方式一样;
- PHP使用
.
运算符追加字符串。 Java使用+
; - Java 5+方法必须使用省略号(
...
)显式声明可变长度参数列表。 所有PHP函数都是可变长度的; - 可变长度参数列表在方法体内被视为数组。 在PHP中,您必须使用
func_get_args()
,func_get_arg()
和/或func_num_args()
; - 毫无疑问更多,但这就是现在想到的一切。
-
您可以使用JavaDoc工具自动生成软件文档。 但是你需要以特定的方式写评论。
-
你无法在手机上运行PHP :)有很多运行时环境和平台。 这意味着您需要提前考虑哪些库可能丢失或可能存在哪些限制(屏幕大小,内存限制,文件路径分隔符“/”或“\”等)。
- RestEasy – 无法找到MessageBodyReader?
- 在某些时间安排消息驱动的bean来访问队列?
- 为什么这个BufferedReader没有以指定的UTF-8格式读取?
- java.lang.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl无法强制转换为javax.xml.parsers.DocumentBuilderFactory
- 免费图书馆支持甘特图和粒度<= 1小时
- 如何解密javascript中的文件,该文件由JAVA用AES加密
- IOException – 使用FileOutputStream拒绝访问
- Struts2:
按钮中的方法属性不起作用 - LDAP:错误代码50 – 由于访问权限不足,无法添加条目uid = test @ info.com,ou = People,o = Drive,dc = company,dc = com