java和php之间微妙的oop差异[关闭]

I found this case

** php example **

abstract class class1{  
    function test(){}  
}


abstract class class2 extends class1{  
    abstract function test();  
} 

This oop concept works in Java, in PHP it doesn't.(Cannot make non abstract method class1::test() abstract in class class2)

What other subtle differences there are between Java and PHP oop ?

Java and PHP (even when using OO PHP) have a vast array of differences.

Just a few thoughts off the top of my head:

  1. Java is strongly-typed, PHP is not, although there is a limited scope for type-hinting in PHP. This makes a huge difference to method signatures. In PHP, you can only force method parameters to be of a certain class or interface or an array:

    public function myMethod(SomeClass $foo, array $bar){}

    ...but you cannot type-hint for primitives! So public function myMethod(int $foo, boolean $bar){} is invalid and will throw a parse error.

    Furthermore, any parameter that has been type-hinted cannot be passed as null unless null is given as a default value. So to allow nulls, you need to use:

    public function myMethod(SomeClass $foo = null)

  2. PHP does not require (or even support) specifying the return type of a function.

  3. PHP classes do not have final fields, although what would be a static final field in Java is a const in PHP. EDIT: A const in PHP is more limited than a static final in Java as the latter can be an array or object instance, whereas the former must be a constant value (number or a string, essentially).

  4. "Overloading" in PHP does not mean the same as it does in Java. In Java, it means specifying multiple methods of the same name, but with a different set of parameters:

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

    In PHP, it refers to the dynamic creation of properties and methods using the __get(), __set() and __callStatic() "magic" methods. See the PHP manual for a description on their use. Java-style method overloading is impossible in PHP and an attempt to redeclare a method (with or without a different set of parameters) will fail.

  5. May be obvious to some, but in PHP you use :: to access static methods and properties and -> to access instance ones, but in Java . is used for both.

  6. PHP doesn't have packages, but it does have namespaces.

  7. As of PHP5, constructors in PHP are not supposed to be methods with a name that matches the class, like in Java, but the magic method __construct() should be declared instead, although the PHP4 style is supported for backward-compatibility. Also, PHP has a destructor method named __destruct().

  8. In Java, all classes inherit from Object, but there is no such generic super-class in PHP.

  9. Even when maximizing the amount of OOP in a PHP script, it still relies on a procedural flow; there's no class-level entry point like in Java (i.e., public static void main(String[] args) or public void init() for applets).