java和php之间的微妙oop差异

时间:2010-08-27 08:25:21

标签: java php oop

我发现了这个案例

** 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之间还有哪些细微差别?

1 个答案:

答案 0 :(得分:13)

Java和PHP(即使使用OO PHP)也存在很多差异。

只是我头脑中的一些想法:

  1. 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)

  2. PHP不需要(甚至不支持)指定函数的返回类型。

  3. PHP类没有final个字段,尽管Java中的static final字段是PHP中的const。编辑:PHP中的const比Java中的static final更受限制,因为后者可以是数组或对象实例,而前者必须是常量值(本质上是数字或字符串)。

  4. PHP中的“重载”并不意味着与Java中的相同。在Java中,它意味着指定多个具有相同名称但具有不同参数集的方法:

    public void myMethod(int foo){}; public void myMethod(float foo){};

    在PHP中,它指的是使用__get()__set()__callStatic()“magic”方法动态创建属性和方法。有关其使用的说明,请参阅PHP manual。 PHP中无法进行Java样式的方法重载,尝试重新声明方法(使用或不使用不同的参数集)将会失败。

  5. 对某些人来说可能是显而易见的,但在PHP中,您使用::来访问静态方法和属性,使用->来访问实例方法,但在Java .中用于两者。

  6. PHP没有软件包,但它有名称空间

  7. 从PHP5开始,PHP中的构造函数不应该是名称与类匹配的方法,就像在Java中一样,但是应该声明魔术方法__construct(),尽管PHP4样式是支持向后兼容性。此外,PHP有一个名为__destruct()的析构函数方法。

  8. 在Java中,所有类都继承自Object,但PHP中没有这样的通用超类。

  9. 即使最大化PHP脚本中的OOP数量,它仍然依赖于程序流程; Java中没有类级别的入口点(例如,对于applet,public static void main(String[] args)public void init())。