Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 17/12/2011, 12h37   #1
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
Par défaut Parcourir des objets issus d'une classe

Bonjour !

Je voudrais savoir comment faire pour par exemple.

J'ai une classe mère Poisson, deux classes Filles : Truite et Saumon.

Comment faire pour faire une boucle qui passe en revue tous les poissons, et affiche par exemple, leur environnement.

Exemple de code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class Poisson{
...
}
class Truite extends Poisson{
 
public $environnement;
 
public function __construct(){
$this->environnement="rivière";
}
 
}
class Saumon extends Poisson{
public $environnement;
 
public function __construct(){
$this->environnement="mer";
}
Je voudrais éviter d'avoir à mettre systématiquement mes poissons dans une array list, pour faire un foreach dessus et afficher la propriété que je veux.

Il n'y a pas mieux à faire?

Je pensais à un truc du genre :

Code :
1
2
3
4
5
6
 
foreach(object as $poisson){
if($poisson instanceof Poisson){
echo $poisson->environnement;
}
}
désolé si je m'y prends mal !

Merci !
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 13h31   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Pour récupérer toutes les classes définies : get_declared_classes( ).
Pour savoir si une classe donnée dérive d'une autre classe utilise is_subclass_of( ) qui permet de travailler sur des noms de classes plutôt que des instances.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 15h14   #3
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
Merci beaucoup Séb,

dernier petit truc qui m'ennuie, sur la liste qu'on récupère, c'est une liste des noms de classes, serait-il possible d'obtenir la liste des objets d'une classe?

Par exemple, tous les objets "poissons", afin de lister leur environnement.

Pour illustrer par du code :

Code :
1
2
3
4
5
6
	$classes=get_declared_classes();	
	foreach($classes as $classe){
		if(is_subclass_of($classe, "Poisson")){
			echo $classe->environnement;
		}
	}
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 15h48   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Pas le choix, il faut instancier les classes dérivées de Poisson...

Code :
1
2
3
4
5
6
foreach ( get_declared_classes( ) as $class ) {
    if ( is_subclass_of($class, 'Poisson') ) {
        $o = new $class( ) ;
        echo $o->environnement, "\r\n" ;
    }
}
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 16h47   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
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 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,

Tu peux aussi éviter à avoir à instancier tes classes à condition d'utiliser une variable ou une fonction statique. Si l'environnement ne change pas, tu peux très bien faire quelque chose comme ça :
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
<?php
 
abstract
class Poisson
{
   abstract static function environnement();
}
 
class Truite
   extends Poisson
{
   static function environnement() {
      return 'rivière';
   }
}
 
class Saumon
   extends Poisson
{
   static function environnement() {
      return 'mer';
   }
}
 
// pour reprendre le code de Seb
foreach (get_declared_classes() as $class) {
   if (is_subclass_of($class, 'Poisson')) {
     echo $class::environnement(), "\r\n" ;
   }
}
 
?>
ou comme ça :
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
<?php
 
abstract
class Poisson
{
   static $environnement;
}
 
class Truite
   extends Poisson
{
   static $environnement = 'rivière';
}
 
class Saumon
   extends Poisson
{
   static $environnement = 'mer';
}
 
// pour reprendre le code de Seb
foreach (get_declared_classes() as $class) {
   if (is_subclass_of($class, 'Poisson')) {
     echo $class::$environnement, "\r\n" ;
   }
}
 
?>
__________________
# 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 18/12/2011, 00h01   #6
Membre du Club
 
Homme jean
Inscription : octobre 2011
Messages : 95
Détails du profil
Informations personnelles :
Nom : Homme jean
Localisation : France, Corse (Corse)

Informations forums :
Inscription : octobre 2011
Messages : 95
Points : 52
Points : 52
Merci bien pour votre aide !

bon dimanche
dev14 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h15   #7
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Petit complément sur le code de rawsrc : appeler une méthode statique ou une propriété statique d'une classe dynamique ne fonctionne qu'à partir de PHP 5.3.

Au passage, le premier code devrait être $class::environnement() et non $class->environnement().
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/12/2011, 15h21   #8
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
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 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par Bisûnûrs Voir le message
Au passage, le premier code devrait être $class::environnement() et non $class->environnement().
Merci, c'est corrigé
__________________
# 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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h01.


 
 
 
 
Partenaires

Hébergement Web