2010-08-27 4 views
9

Je trouve ce casDes différences subtiles oop entre java et php

** exemple php **

abstract class class1{ 
    function test(){} 
} 


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

Ce concept oop fonctionne en Java, en PHP, il ne fonctionne pas. (Cannot make non abstract method class1::test() abstract in class class2)

Quelles autres différences subtiles entre Java et PHP oop? Java et PHP (même en utilisant OO PHP) ont un vaste éventail de différences.

+1

Mot-clé 'function' dans java? –

+0

void ... en java .. mais le même principe oop – danidacar

+9

S'il s'agit d'une compilation de ces différences, vous devriez créer ce wiki communautaire, car il n'y a pas de réponse finale à votre "question". – PhiLho

Répondre

12

Juste quelques pensées du haut de ma tête:

  1. Java est fortement typé, PHP n'est pas, bien qu'il y ait une portée limitée pour le type-hinting en PHP. Cela fait une énorme différence pour les signatures de méthodes. En PHP, vous ne pouvez forcer les paramètres de méthode pour être d'une certaine classe ou une interface ou un tableau:

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

    ... mais vous ne pouvez pas taper indication pour supprimer les primitives! Donc public function myMethod(int $foo, boolean $bar){} est invalide et va lancer une erreur d'analyse.

    En outre, un paramètre qui a été de type insinué ne peut pas être passé comme nullà moins null est donnée à une valeur par défaut. Donc, pour permettre null s, vous devez utiliser:

    public function myMethod(SomeClass $foo = null)

  2. PHP ne nécessite pas (ou support même) spécifiant le type de retour d'une fonction.

  3. Les classes PHP n'ont pas de champs final, bien que ce qui serait un champ static final en Java soit un const en PHP. EDIT: Un const en PHP est plus limité qu'un static final en Java car ce dernier peut être un tableau ou une instance d'objet, alors que le premier doit être une valeur constante (un nombre ou une chaîne, essentiellement). "Surcharge" en PHP ne signifie pas la même chose qu'en Java. En Java, cela signifie spécifier plusieurs méthodes du même nom, mais avec un ensemble de paramètres différents:

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

    En PHP, il fait référence à la création dynamique de propriétés et méthodes en utilisant le __get(), __set() et __callStatic() méthodes "magiques". Voir le PHP manual pour une description de leur utilisation. La surcharge de méthode Java est impossible en PHP et une tentative de redéclenchement d'une méthode (avec ou sans un ensemble de paramètres différent) échouera.

  4. Peut être évident pour certains, mais en PHP vous utilisez :: pour accéder aux méthodes et propriétés statiques et -> pour accéder à ceux d'instance, mais en Java . est utilisé pour les deux.

  5. PHP n'a pas de packages, mais il contient namespaces.Depuis PHP5, les constructeurs en PHP ne sont pas censés être des méthodes avec un nom correspondant à la classe, comme en Java, mais la méthode magique __construct() devrait être déclarée à la place, bien que le style PHP4 soit supporté pour la rétrocompatibilité . En outre, PHP a une méthode de destructeur nommée __destruct().

  6. En Java, toutes les classes héritent de Object, mais il n'y a pas de super-classe générique en PHP.

  7. Même en maximisant la quantité de POO dans un script PHP, il repose toujours sur un flux procédural; il n'y a pas de point d'entrée au niveau de la classe comme en Java (c'est-à-dire, public static void main(String[] args) ou public void init() pour les applets).

+0

'const' et' final' sont sémantiquement différents de toute façon. – BoltClock

+0

Oui, ils le sont. Mon point est que le plus proche de la 'static final' de Java en PHP est un' const' et que PHP n'a pas d'équivalence 'final' au niveau de la propriété. – megaflop

+0

les points 1 et 2 ne sont pas pertinents après la libération de php 7. – TermiT

0

Major 3 choses que je me souviendrai toujours pour PHP OO ne pas:

1 PHP n'a pas de fonction principale pour les classes.


2-Comme C++ vous avez déclarer un constructeur et destructor-à-dire __construct()


3-Vous ne pouvez pas déclarer finale (constante) à vos variables, mais les méthodes et les classes afin qu'ils ne peut pas être remplacé et hérité repsectivley.


4- (Bonus) La pire chose, la structure de données n'est pas OO. Vous utilisez des tableaux de toutes les façons. Pas de support pour les collections.