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 ?
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()
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
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. :-
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
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
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).
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
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.
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.
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.
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 ?
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 ?
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 ?
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(); } }
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();
}
}
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(); } }