我发现了这个案例
** php example **
abstract class class1{
function test(){}
}
abstract class class2 extends class1{
abstract function test();
}
这个oop概念在Java中运行,在PHP中它没有。(Cannot make non abstract method class1::test() abstract in class class2
)
Java和PHP oop之间还有哪些细微差别?
答案 0 :(得分:13)
Java和PHP(即使使用OO PHP)也存在很多差异。
只是我头脑中的一些想法:
Java是强类型的,PHP不是,尽管PHP中的类型提示的范围有限。这对方法签名产生了巨大的影响。在PHP中,您只能强制方法参数属于某个类或接口或数组:
public function myMethod(SomeClass $foo, array $bar){}
...但你不能为原语输入提示!所以public function myMethod(int $foo, boolean $bar){}
无效并且会抛出一个解析错误。
此外,除非null
作为默认值,否则任何已经过类型提示的参数都无法作为null
传递。因此,要允许null
s,您需要使用:
public function myMethod(SomeClass $foo = null)
PHP不需要(甚至不支持)指定函数的返回类型。
PHP类没有final
个字段,尽管Java中的static final
字段是PHP中的const
。编辑:PHP中的const
比Java中的static final
更受限制,因为后者可以是数组或对象实例,而前者必须是常量值(本质上是数字或字符串)。
PHP中的“重载”并不意味着与Java中的相同。在Java中,它意味着指定多个具有相同名称但具有不同参数集的方法:
public void myMethod(int foo){}; public void myMethod(float foo){};
在PHP中,它指的是使用__get()
,__set()
和__callStatic()
“magic”方法动态创建属性和方法。有关其使用的说明,请参阅PHP manual。 PHP中无法进行Java样式的方法重载,尝试重新声明方法(使用或不使用不同的参数集)将会失败。
对某些人来说可能是显而易见的,但在PHP中,您使用::
来访问静态方法和属性,使用->
来访问实例方法,但在Java .
中用于两者。
PHP没有软件包,但它有名称空间。
从PHP5开始,PHP中的构造函数不应该是名称与类匹配的方法,就像在Java中一样,但是应该声明魔术方法__construct()
,尽管PHP4样式是支持向后兼容性。此外,PHP有一个名为__destruct()
的析构函数方法。
在Java中,所有类都继承自Object
,但PHP中没有这样的通用超类。
即使最大化PHP脚本中的OOP数量,它仍然依赖于程序流程; Java中没有类级别的入口点(例如,对于applet,public static void main(String[] args)
或public void init()
)。