Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 08h12   #1
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Par défaut [POO] portée des propriétés

Soit le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
abstract class test {
 
    protected $protege;
    private $prive;
 
    public function afficher() {
        return $this->protege . " " . $this->prive;
    }
 
    abstract function affichageAbstrait();
}
 
class heriteTest extends test {
 
    public function __construct($pro, $pri) {
        try {
            $this->protege = $pro;
            $this->prive = $pri;
        } catch (Exception $ex) {
 
            die($ex . getMessage());
        }
    }
 
    function affichageAbstrait() {
        return $this->protege . " " . $this->prive;
    }
 
}
 
$unObjet = new heriteTest("Hello", "World");
echo "appel public : " . $unObjet->afficher();
echo "<br />";
echo "appel abstrait : " . $unObjet->affichageAbstrait();
?>
Résultat :
appel public : Hello
appel abstrait : Hello World

Pourquoi dans un cas $pri apparait (appel depuis méthode abstraite de la sous classe) et pas dans l'autre (appel depuis la méthode publique de la surclasse).
Il me paraîtrait logique que $pri ne s'affiche nulle part ou encore que le constructeur déclenche une exception puisque par définition $pri est privé et donc non accessible dans la sous-classe.
donc... à quoi correspond cet appel $this->prive dans la méthode abstraite ?
Je n'ai pas non plus de méthodes magiques!
Merci pour les réponses.
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 09h48   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 809
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 809
Points : 1 524
Points : 1 524
PHP est assez libre mais faut pas coder avec les pieds non plus.

Une class abstraite est abstraite ! Donc pas de propriétés si ce n'est des constantes, et pas d'implémentation de méthodes !
Vu que ce que tu as codé n'a pour moi aucun sens, je ne saurais te répondre quand à ce que fait PHP.

http://fr.wikipedia.org/wiki/Classe_abstraite
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 04
Vieux 14/10/2011, 09h53   #3
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par transgohan Voir le message
Une class abstraite est abstraite ! Donc pas de propriétés si ce n'est des constantes, et pas d'implémentation de méthodes !
http://fr.wikipedia.org/wiki/Classe_abstraite
Houlà tu y vas fort, une classe abstraite peut très bien contenir des propriétés et, soyons fous, même des méthodes. C'est un de leur intérêt : factoriser le code et forcer la définition que de ce qui est nécessaire.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 09h58   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
@loustalet
Ton problème vient du fait que ta classe heriteTest ne peut pas avoir accès au membre privé $prive de ta classe abstraite. Donc ton de la classe heriteTest ne définit pas le private $prive de ta classe abstraite
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h01   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par transgohan Voir le message
Une class abstraite est abstraite ! Donc pas de propriétés si ce n'est des constantes, et pas d'implémentation de méthodes !
Vu que ce que tu as codé n'a pour moi aucun sens, je ne saurais te répondre quand à ce que fait PHP.
pas confondre avec une interface
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 10h16   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 551
Points : 2 551
Envoyer un message via Skype™ à rawsrc
Voici comment procéder (une soluce parmi d'autres) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
 
abstract class test {
 
    protected $protege;
    private $prive;
 
    function __construct($pri) {
       $this->prive = $pri;
    }
 
    function afficher() {
        return $this->protege . " " . $this->prive;
    }
 
    abstract function affichageAbstrait();
 
    function getPrive() {
       return $this->prive;
    }
}
 
class heriteTest extends test {
 
    public function __construct($pro, $pri) {
        try {
           parent::__construct($pri);
           $this->protege = $pro;
           //$this->prive = $pri;
        } catch (Exception $ex) {
            die($ex . getMessage());
        }
    }
 
    function affichageAbstrait() {
        //return $this->protege . " " . $this->prive;
        return $this->protege . " " . parent::getPrive();
        // ou return $this->protege . " " . $this->getPrive();
    }
 
}
 
$unObjet = new heriteTest("Hello", "World");
echo "appel public : " . $unObjet->afficher();
echo "<br />";
echo "appel abstrait : " . $unObjet->affichageAbstrait();
?>
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h29   #7
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 809
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 809
Points : 1 524
Points : 1 524
Citation:
Envoyé par stealth35 Voir le message
pas confondre avec une interface
Ah oui en effet ! Mea culpa...
J'aurai du prendre un double café ce matin, voilà le second topic où je répond à côté...
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h34   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par transgohan Voir le message
Ah oui en effet ! Mea culpa...
J'aurai du prendre un double café ce matin, voilà le second topic où je répond à côté...
pas grave ça arrive
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/10/2011, 18h17   #9
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Bonsoir,

Merci pour les réponses.
J'ai bien compris ce que je faisais ..... et que ce n'est pas à faire...
Je connais bien le principe des interfaces et des classes abstraites.... ce qui me surprend c'est que PHP accepte mon code sans broncher..... je ne sais pas où il stocke le $privé de la classe heriteTest.......

... je n'ai pas testé en C++ , java ou C#, mais je suis plus que quasiment certain que ça ne passe pas !
Bon we
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 18h34   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par loustalet Voir le message
ce qui me surprend c'est que PHP accepte mon code sans broncher.....
ton niveau d'erreur est au maximum ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 19h54   #11
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Je pense que oui, si tu veux, tu peux essayer et me dire si ça fait pareil chez toi.
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 21h08   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
c'est un comportement normale, en héritage t'as accès au proteted mais pas au privé au niveau des méthode

ps : le try ... catch est inutile
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 23h00   #13
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Effectivement j'ai mis le try catch pour voir si...jamais il déclenchait qq chose !
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 23h04   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par loustalet Voir le message
Effectivement j'ai mis le try catch pour voir si...jamais il déclenchait qq chose !
ducoup quel est le problème ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 22h45   #15
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Je ne comprends pas pourquoi dans le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
abstract class test {
 
    protected $protege;
    private $prive;
 
    public function afficher() {
        return $this->protege . " " . $this->prive;
    }
 
    abstract function affichageAbstrait();
}
 
class heriteTest extends test {
 
    public function __construct($pro, $pri) {
        try {
            $this->protege = $pro;
            $this->prive = $pri;
        } catch (Exception $ex) {
 
            die($ex . getMessage());
        }
    }
 
    function affichageAbstrait() {
        return $this->protege . " " . $this->prive;
    }
 
}
 
$unObjet = new heriteTest("Hello", "World");
echo "appel public : " . $unObjet->afficher();
echo "<br />";
echo "appel abstrait : " . $unObjet->affichageAbstrait();
?>
l'instruction
dans la classe héritée ne provoque pas d'erreur, ne renseignepas la propriété privée $priv de la classe mère et du coup, je ne sais pas où est stockée la valeur de cetet variable que j'arrive malgré tout à afficher dans l'instruction
Code :
echo "appel abstrait : " . $unObjet->affichageAbstrait();
Mais pas dans
Code :
echo "appel public : " . $unObjet->afficher();
...C'est tout !
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2011, 22h55   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
fais un var_dump($unObjet); et tu comprendras
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 07h27   #17
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Voici le résultat de var_dump :

object(heriteTest)#1 (3) { ["protege":protected]=> string(5) "Hello" ["prive":"test":private]=> NULL ["prive"]=> string(5) "World" }

Si je comprends bien :
"Hello" est stocké dans le membre protected "protege"
le membre "prive" de visibilité private de la classe "test" est null (je m'en doutais)
l'objet heriteTest a généré une variable "privé" et l'a initialisé à "World".

Si c'est ça, je m'en doutais, mais je suis plus que surpris que php se génère des données membres quand il ne trouve pas de donnée membre à affecter .... je me trompe ?
Merci
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 08h51   #18
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 809
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 809
Points : 1 524
Points : 1 524
C'est bien ça. Le code suivant fonctionnerait ainsi :
Code php :
1
2
3
4
5
6
7
8
9
10
class Test {
  function __construct($a, $b) {
    $this->a = $a;
    $this->b = $b;
  }
  public function afficher() {
    echo $this->a;
    echo $this->b;
  }
}
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 12h39   #19
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par loustalet Voir le message
Si c'est ça, je m'en doutais, mais je suis plus que surpris que php se génère des données membres quand il ne trouve pas de donnée membre à affecter .... je me trompe ?
Merci
c'est bien ça, il a pas accès donc il crée la propriété en public
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 23h06   #20
Futur Membre du Club
 
Inscription : janvier 2010
Messages : 76
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 76
Points : 19
Points : 19
Merci pour les réponses.....
Je ne veux pas lancer un nouveau débat, mais.... vive les déclarations explicites de variables, et encore plus++ en poo !
Bonne fin de soirée
loustalet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web