java和php之间的微妙oop差异

dan*_*car 9 php java oop

我发现了这个案子

**php示例**

abstract class class1{  
    function test(){}  
}


abstract class class2 extends class1{  
    abstract function test();  
} 
Run Code Online (Sandbox Code Playgroud)

这个oop概念在Java中运行,在PHP中它没有.(Cannot make non abstract method class1::test() abstract in class class2)

Java和PHP oop之间还有哪些细微差别?

meg*_*lop 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作为默认值给出,否则任何已经类型提示的参数都不能传递.所以要允许nulls,你需要使用:

    public function myMethod(SomeClass $foo = null)

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

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

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

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

    在PHP中,它指的是动态创建的属性和使用方法__get(),__set()__callStatic()"神奇"的方法.有关其用法的说明,请参阅PHP手册.在PHP中不可能进行Java样式的方法重载,并且尝试重新声明方法(使用或不使用不同的参数集)将会失败.

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

  6. PHP没有包,但它确实有名称空间.

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

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

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