Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-06-2008 10:28:36

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

[OK][POO] Question sur l'héritage de classes et fonctions abstraites

Bonjour à tous !
Je n'ai pas trouvé de section plus appropriée; je m'en excuse.
J'aimerais poser une question portant sur la POO en général, et plus précisément sur l'héritage de fonctions provenant d'une classe mère abstraite.
Cette classe mère (qui est donc abstraite, ça ne fait que la 3e fois que je le dis) possède des fonctions abstraites qui doivent être publiques dans la classe fille.
Ma question est : quelle visibilité donner à ma fonction abstraite de la mère, pour qu'elle soit publique dans la fille ?
J'aurais tendance à la déclarer publique directement dans la mère, étant donné que étant abstraite, on ne pourra de toute manière jamais l'appeler dans la mère.
Mais suis-je en train de faire une erreur de conception ?
Si je déclare ma fonction abstraite "protected" dans la mère, comment la rendre publique dans la fille ?

Merci d'avance smile

Dernière modification par Bast (09-06-2008 10:44:21)

Hors ligne

 

#2 09-06-2008 10:38:15

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

non c'est bien ça la méthode doit être qualifié avec le même accésseur dans la classe mère et la classe fille.

A+JYT

Hors ligne

 

#3 09-06-2008 10:39:28

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Ok merci bcp !

Hors ligne

 

#4 09-06-2008 10:59:49

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Oh une autre question qui se rapporte aussi à ça :
En ce qui concerne les attributs qui doivent devenir PRIVES dans la classe fille... je ne peux pas les déclarer privés dans la classe mère, sinon pas d'héritage :s
Je déclare comment ? Pour l'instant j'ai mis protected, mais je me demande...

Hors ligne

 

#5 09-06-2008 11:20:13

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Bonjour,
Désolé sekaijin, mais ce n'est pas tout à fait vrai : les méthodes de la classe fille doivent être déclarées avec la même visibilité ou visibilité plus faible. En outre, dans la classe mère, on peut avoir une méthode protected et dans la classe fille, la mettre en public.

Hors ligne

 

#6 09-06-2008 11:22:07

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Mais tu te contredis !
Tu dis que la visibilité doit être égale, ou plus faible, et juste après tu dis le contraire :s

Bon et maintenant, keskejefé ? ><

Hors ligne

 

#7 09-06-2008 11:30:47

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Ordre de visibilité :
private->protected->public

- Si la méthode de la classe mère est private, dans la classe fille, elle peut être private, protected ou public;
- Si la méthode de la classe mère est protected, dans la classe fille, elle peut être protected ou public;
- Si la méthode de la classe mère est public, dans la classe fille, elle ne pourra être que public;

Pour les attributs, je ne suis pas sûr que tu puisses en déclarer directement dansune classe mère abstraite (à vérifier)

Je t'invite à aller voire la doc officielle sur le site de PHP

Hors ligne

 

#8 09-06-2008 11:34:30

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Il me semble qu'un attribut private dans la mère ne sera pas hérité par les filles...

Hors ligne

 

#9 09-06-2008 12:03:25

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

J'ai fait quelques test avant de répondre. J'ai écrit les class suivantes :

Code:

/**
 * File : myAbstract.class.php
 */

abstract class myAbstract {

    private $value = 2;
    
    abstract protected function getValue();
}

Code:

<?php
/**
 * File : myConcrete.class.php
 */

require( 'myAbstract.class.php' );

class myConcrete extends myAbstract {

    public function getValue()
    {
        return $this->value;    
    }
}
?>

Code:

<?php
/**
 * File : testAbstact.php
 */
 
require( 'myConcrete.class.php' );
$myAbstractObj = new myConcrete();

print_r( $myAbstractObj );
?>

Ce qui donne :

Code:

myConcrete Object
(
    [value:private] => 2
)

Donc la classe fille hérite bien des attibuts quelque soit leur visibilité.

Cependant, dans myConcrete.class.php, j'ai tenté de mettre getValue() en private, et là g l'erreur suivante :
Fatal error: Abstract function myAbstract::getValue() cannot be declared private in /home/*/myAbstract.class.php on line 10 ???
J'ai pas trop le temps de pousser plus les tests... Faudrait voir un peu plus, et il faut avouer que pour le coup, la doc n'est pas très toufu sad
Si quelqu'un a une explication, ma foie, ça m'interresse

Hors ligne

 

#10 09-06-2008 12:09:28

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Donc tes tests disent "Dans une classe abstraite, on peut déclarer private des attributs, mais pas des fonctions" !

Moi ce qui me gène, c'est que je ne sais pas comment changer la visibilité d'un attribut ou d'une fonction, tout en faisant comprendre à php que c'est bien ceux de la mère que je veux utiliser, que je ne fais qu'en changer la visibilité, mais qu'il faut quand même utiliser le code de la classe mère...

Cela dit, je ne fais que me poser des questions... car en pratique, ces attributs et fonctions ne seront JAMAIS appelés, puisque la mère est abstraite... C'est donc un demi problème...

Dernière modification par Bast (09-06-2008 12:10:53)

Hors ligne

 

#11 09-06-2008 12:59:41

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Peut être que je me trompe mais pour moi:
- Si la méthode/attribut de la classe mère est private, dans la classe fille, elle ne peut être que private; (EDIT : faux-> pas hérité)
- Si la méthode/attribut de la classe mère est protected, dans la classe fille, elle peut être protected ou public;
- Si la méthode/attribut de la classe mère est public, dans la classe fille, elle pourra être private, protected ou public;

Un petit rajout gratuit: ne vous amusez pas avec l'héritage de membre static ou de const, ça marche pas un brin...

Dernière modification par Mr.MoOx (09-06-2008 16:45:47)

Hors ligne

 

#12 09-06-2008 14:09:40

NewSky
Membre
Date d'inscription: 17-12-2007
Messages: 79

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Le problème n'est donc pas qu'on utilise une class abstraite, mais c'est bien un problème d'héritage. Dans l'absolue, étendre une class abstraite et une class "normal" revient au même, si ce n'est que toutes les méthodes abstraites (abstract function ...) d'une class abstraite (abstract class ...) doivent obligatoirement être re-définie dans la class qui l'étend (et toutes les méthodes d'une class abstraite ne sont pas nécessairement abstraites sad <peut-être que j'embrouille un peu mon explication là:> ...
Pour en revenir à la redéfinition des contrôles d'accès, je me permets de citer quelques lignes du merveilleux livre PHP5 avancé :

[...]PHP vous laisse libre de changer ces contrôles d'accès à l'unique condition que la nouvelle directive soit identique ou plus large que l'ancienne. [...]
Autrement dit, une méthode protégée peut être remplacé par une méthode de même niveau ou un méthode publique. Une méthode publique ne peut être remplacée que par une autre méthode publique. Si une méthode était déclarée privée dans la classe parente, vous pourriez la définir avec n'importe quel contrôle d'accès dans la classe fille. Dans ce dernier cas, il y a cependant des comportements non naturels à prendre en compte.
[...]Si vous redéfinissez une méthode privée, PHP considérera qu'il y a deux méthodes de même nom simultanément dans la classe. Si c'est une méthode de la classe mère qui fait appel, elle accédera à la méthode privée initiale. Si inversement c'est une méthode de la classe fille qui y fait appel, elle accèdera à la nouvelle implémentation.[...]

Au final, il est conseillé de ne pas redéfinir les méthodes privées.

Pour ton cas, Bast, si te veux modifier la visibilité d'une méthode, tout en utilisant le code du parent, je ferais ça :

Code:

<?php
public function maFonction()
{
    parent::maFonction();
}
?>

En considérant, comme je l'ai écrit plus haut, que dans ta class parente, qu'elle soit abstraite ou pas, ta méthode, elle, ne soit pas abstraite.

Dernière modification par NewSky (09-06-2008 14:14:58)

Hors ligne

 

#13 09-06-2008 15:08:52

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Merci pour ces précisions qui m'aident beaucoup !
Dans mon cas, j'ai au final :
Classe mere abstraite. Elle contient des attributs private, mais pas abstract. Elle contient des fonctions abstract ou non, toutes publiques. Je n'aurai donc pas besoin de modifier leur visibilité. Le fait que ma classe mere soit abstraite est une sécurité : jamais on ne pourra appeler les fonctions directement sur la mere.

Les classes filles ne redéfiniront que les fonctions abstraites, sans modifier la visibilité. Elles ne redéfiniront pas les fonctions concretes, ce qui implique que l'appel de l'une de ces fonctions sur une classe fille entrainera implicitement l'appel de ladite fonction de la mere.

Ce comportement me va. Et à vous ?

Hors ligne

 

#14 09-06-2008 16:41:44

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

# Ce qui est privé n'est pas hérité.
# Ce qui est protégé l'est et pourra être redéfini (si besoin) dans la fille protégé ou public, mais pas privé ( on ne brise pas un principe fondamental de la POO qu'est l'héritage )
# Si redéfini, $this réprésente l'instance de la classe basse, pour revenir dans la classe haute il faut utiliser parent::
# Dans une classe abstraite, toute méthode abstraite DEVRA être redéfinie dans la fille, sauf si celle-ci est abstraite à son tour, et redéclare la méthode héritée abstraite ( fait suivre à la fille suivante, on utilise ca dans Zend_Db, on appelle ça un contrat )
# Si au minimum une méthode est délcarée abstraite, la classe DOIT être abstraite.
# Une méthode déclarée private et abstraite est donc un contre-sens, ça n'est pas possible
# Toute méthode redéfinie doit avoir LA MEME SIGNATURE que la méthode héritée (nombre de params, facultativité du param ) on appelle ca le principe de substitution de liskov en génie logiciel ) sinon PHP retourne une E_STRICT

etc.... on pourrait passer la nuit sur le modèle Objets de PHP5 ^^

Hors ligne

 

#15 09-06-2008 16:57:15

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Merci Julien !
On en revient donc à ma première remarque :

Bast a écrit:

Il me semble qu'un attribut private dans la mère ne sera pas hérité par les filles...

ma mémoire ne me faisait donc pas défaut !

M'enfin au final, cette mise au point ne remet pas en cause ce que je compte faire.

Hors ligne

 

#16 09-06-2008 17:47:35

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Ah oui après, il existe des solutions génériques de conception logicielle éprouvées depuis 20ans ; on appelle ça les design patterns ;-)

Hors ligne

 

#17 10-06-2008 01:18:29

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Tu parles de façon bien générique...
Le jour où ils ont parlé des design pattern, j'écoutais pas... Auquel tu penses en particulier ?

Hors ligne

 

#18 10-06-2008 09:20:05

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

A aucun, à vrai dire je n'ai pas lu ton problème jusqu'au bout :-p
Après les DP, ça va ça vient quoi :-D

Hors ligne

 

#19 10-06-2008 15:23:12

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Bonjour Bast,

J'ajoute juste un point sur cette discussion : une classe abstraite est faite pour donner un modèle de classe (et très souvent pour "préremplir une interface"). J'ai tendance à penser que la visibilité d'une fonction (private, protected ou public) est définie par ta classe abstraite. Quel que soit ce qu'on a le droit de faire avec la syntaxe de PHP, je ne pense pas que ça soit judicieux de changer cette visibilité.

On peut penser que les éléments qui vont utiliser ton objet vont utiliser les méthodes de ton abstract en ayant en tête les visibilités définies l'abstract. Le but est qu'ils n'aient pas à connaître l'implémentation...
Donc même si on peut syntaxiquement changer ces visibilité, ça me paraît être un non sens...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#20 10-06-2008 15:29:12

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [OK][POO] Question sur l'héritage de classes et fonctions abstraites

Merci pour cet ajout smile
Ca confirme un peu plus que ma proposition est bonne smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages