OVH Cloud OVH Cloud

Constructeurs PHP 5

8 réponses
Avatar
Zouplaz
Bonjour, j'ai du mal à comprendre la différence entre les constructeurs qui
existent dans la version 4 (la fonction porte le même nom que la classe) et
le __construct() proposé dans la version 5 ?

Est-ce la même chose, et si oui quel en est l'intérêt ?

Merci

8 réponses

Avatar
loufoque
Zouplaz a dit le 24/08/2004 15:28:

Est-ce la même chose, et si oui quel en est l'intérêt ?
Oui, c'est la même chose.

L'intérêt, c'est que le nom du constructeur ne dépend plus du nom de la
classe.
C'est plus pratique pour appeler le constructeur parent par exemple.

Avatar
DJiK
C'est plus pratique pour appeler le constructeur parent par exemple.



Mais on est obligé de l'appeler maintenant, si j'ai bien compris? :-

--
DJiK

Avatar
loufoque
DJiK a dit le 26/08/2004 09:28:
C'est plus pratique pour appeler le constructeur parent par exemple.


Mais on est obligé de l'appeler maintenant, si j'ai bien compris? :-

Il a toujours fallu l'appeler non ?

Avant c'était parent::nomDeLaClasseParente(), maintenant c'est
parent::__construct()


Avatar
DJiK
Il a toujours fallu l'appeler non ?



Non il s'appelait tout seul.


PHP 4:
http://www.php.net/manual/fr/language.oop.constructor.php
«Si une classe n'a pas de constructeur, le constructeur de la classe de basse est appelé, s'il existe.»



Et il voyait ça comme une correction par rapport au PHP 3. Puis finalement retour en arrière:


PHP 5:
http://www.php.net/manual/fr/language.oop5.decon.php
« Les constructeurs parents _ne sont pas appelés implicitement_. Si vous voulez utiliser un constructeur parent, il sera nécessaire de faire appel à parent::__construct().»




Je trouve très dommage, dans la mesure où ça s'éloigne de ce qui se fait en C++ et Java. Alors que le style PHP 4 était + proche. :-

--
DJiK

Avatar
Ganf
Le Thu, 26 Aug 2004 22:34:09 +0000, DJiK a écrit :
PHP 4:
http://www.php.net/manual/fr/language.oop.constructor.php «Si une
classe n'a pas de constructeur, le constructeur de la classe de basse
est appelé, s'il existe.»

PHP 5:
http://www.php.net/manual/fr/language.oop5.decon.php « Les
constructeurs parents _ne sont pas appelés implicitement_.


En fait ce qui est marqué ici pour PHP4 est vrai aussi pour PHP5, et ce
qui est marqué ici pour PHP5 est vrai aussi pour PHP4.

Il y a deux choses à prendre en compte :

1 - si une classe n'a pas de constructeur, PHP essaie d'appeler le
constructeur de la classe parente, et ainsi de suite jusqu'à la classe de
base. C'est vrai en PHP4 comme en PHP5, c'est ce qu'indique ta première
explication.

2- si un constructeur existe et est appelé, les constructeurs parents ne
sont pas automatiquement appelés, il faudra le faire manuellement (via
parent::nom_classe() en PHP4 ou via parent::__construct() avec la nouvelle
syntaxe PHP5). C'est vrai en PHP4 comme en PHP5, c'est ce qu'indique la
seconde explication.

La seule chose qui change entre PHP4 et PHP5 sur les cosntructeurs c'est
le nom de la méthode appelée. Et encore, puisque PHP5 maintient la
compatibilité (si le constructeur avec le nouveau nom n'existe pas il
essaye d'appeler le constructeur avec l'ancien nommage).

--
Eric Daspet

Avatar
loufoque
DJiK a dit le 27/08/2004 00:34:


Il a toujours fallu l'appeler non ?


Non il s'appelait tout seul.


PHP 4: http://www.php.net/manual/fr/language.oop.constructor.php
«Si une classe n'a pas de constructeur, le constructeur de la classe de
basse est appelé, s'il existe.»


Ah oui, le constructeur parent est effectivement appelé si la classe n'a
pas de constructeur. C'est toujours valable en PHP5.


Avatar
Sebastien
DJiK wrote:

PHP 5:
http://www.php.net/manual/fr/language.oop5.decon.php
« Les constructeurs parents _ne sont pas appelés implicitement_. Si vous
voulez utiliser un constructeur parent, il sera nécessaire de faire
appel à parent::__construct().»



Pourtant ceci :

<?php
class ClasseMere {
function __construct( ) {
echo 'Constructeur de ClasseMere' ;
}
}

class ClasseFille extends ClasseMere {

}

new ClasseFille( ) ; // Affiche "Constructeur de ClasseMere"
?>

... fonctionne (PHP5RC2). Que faut-il en déduire ?

Avatar
Marc
DJiK wrote:

C'est plus pratique pour appeler le constructeur parent par exemple.




Mais on est obligé de l'appeler maintenant, si j'ai bien compris? :-



un peu de précisions.

l'intéret du construct est surtout pour le developpeur
de classes qui n'a plus a se soucier du nom de la classe parente
quand il developpe des classes avec héritage.

class Fils extends class Parent{

# constructeur
function __construct(){
# permet d'appeler le constructeur parent
# quelque soit le nom de la classe.
parent::__construct();

# init locales a la classe
$this->attrib = '123';
}
}

si fils vient a heriter, suite a un changement de design des classes
d'une autre classe, le constructeur a des chances de rester strictement
identique. C'est le seul avantage positif de la chose.

Le constructeur parent doit etre explicitement appelé, contrairement
au C++.

A la création des instances, le constructeur est logiquement appelé
avec tous les parametres.

Il y a une posssibilité d'anticiper sur la compatibilité php4 php5
en appelant explicitement le constructeur :

class Fils extends class Parent{

# passerelle de compatibilité 4 vers 5
function Fils(){
$this->__construct();
# attention
# parent::__construct ne marche pas dans tous les cas
}

# constructeur php5
function __construct(){
# permet d'appeler le constructeur parent
# quelque soit le nom de la classe.
parent::__construct();
}
}