Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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/11/2011, 22h51   #1
Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 94
Points : 48
Points : 48
Par défaut Foreach : ça marche par magie ?

Bonjour je cherche actuellement à mieux saisir la POO et je suis sur les interfaces. Prenons l'exemple avec l'interface Iterator:

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
 
class MyIterator implements Iterator
{
    public function current()
    {
        //on implemente la fonction pour l'adapter à notre classe
    }
 
    public function key()
    {
        //on implemente la fonction pour l'adapter à notre classe
    }
 
    public function rewind()
    {
        //on implemente la fonction pour l'adapter à notre classe
    }
 
    public function next()
    {
        //on implemente la fonction pour l'adapter à notre classe
    }
 
    public function valid()
    {
        //on implemente la fonction pour l'adapter à notre classe
    }
}
et la si je fais
Code :
1
2
3
4
5
6
7
 
$object = new MyIterator();
 
foreach($object as $key => $value)
{
     //ce que je veux 
}
Ben ça donne l'itération implémentée dans ma classe.
Je me dis alors c'est super les interfaces!
sauf que d'un coup je me demande: "Attends mais comment ça marche, c'est magique ou quoi ?"
Comment le fait de définir ces 5 méthodes fait que celles ci soient maintenant utilisées par la fonction php "foreach"

Je voudrais donc qu'on m'explique un peu plus le fonctionnement interne de la fonction php "foreach" (j'ai cherché le code mais j'ai pas trouvé). Est ce qu'à chaque fois "foreach" cherche si les méthodes current(),key(),rewind(),next() et valid() sont implémentées dans la classe qu'il doit itérer et si oui il les utilise??

Est ce que si je définis ces fonctions dans une classe sans que celle ci implémente Iterator alors ça marche aussi ou le fait que ce soit l'interface "Iterator" qui doit être implémentée est important dans le code source de la fonction "foreach" ??

Je sais que c'est un peu de la masturbation cérébrale qui sert à rien (ça marche, c'est que ça marche) mais j'en ai besoin pour comprendre le vrai sens des interfaces pour par la suite les utiliser.

Merci et désolé pour le mal de crâne !
johnbenz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 03h23   #2
Membre Expert
 
Avatar de Seb33300
 
Homme Sébastien Alfaiate
Développeur Web
Inscription : janvier 2007
Messages : 1 329
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Alfaiate
Âge : 26
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 1 329
Points : 1 657
Points : 1 657
Une interface, ça ne fait que définir des méthodes qui doivent être implémenté dans l’objet qui l'implémente.

Cela veux dire que si tu crais une classe qui implémente l'interface iterator, tu sera forcé de définir les méthodes de cette interface dans ton objet.
Et bien sur, le code qui va avec.

Ce n'est pas "magique", le simple fait de d'implémenter iterator ne va pas te permettre de faire fonctionner la fonction foreach pour parcourir le contenu de ton objet.
Il faut que tu codes le contenu des méthodes qui va permettre de le parcourir.
A savoir :
current(), key(), etc...

Parceque c'est ces méthodes qui seront utilisé par foreach pour parcourir ton objet.


Citation:
Est ce que si je définis ces fonctions dans une classe sans que celle ci implémente Iterator alors ça marche aussi ou le fait que ce soit l'interface "Iterator" qui doit être implémentée est important dans le code source de la fonction "foreach" ??
Je pense que oui mais j'en suis pas certain, à vérifier...
Edit :
Non ça ne fonctionne pas, je viens de faire le test. Il faut obligatoirement implémenter l'interface Iterator si tu veux que ton foreach fonctionne.
__________________
Zend Certified Engineer PHP 5.3

« Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana
Seb33300 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 04h26   #3
Membre du Club
 
Homme
Étudiant
Inscription : juin 2011
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2011
Messages : 94
Points : 48
Points : 48
Salut Seb, merci pour ta réponse
Citation:
Envoyé par Seb33300 Voir le message
Ce n'est pas "magique", le simple fait de d'implémenter iterator ne va pas te permettre de faire fonctionner la fonction foreach pour parcourir le contenu de ton objet.
Il faut que tu codes le contenu des méthodes qui va permettre de le parcourir.
Oui ça j'avais compris qu'il fallait les coder j'ai juste mis la class "MyIterator" à titre de support pour ma question.


Citation:
Envoyé par Seb33300 Voir le message
Parce que c'est ces méthodes qui seront utilisé par foreach pour parcourir ton objet.
En gros c'est ça ma question. Ca me confirme ce que je pensais, l'interface nous oblige à coder des fonctions qui seront utilisées par foreach.
Tel que je l'avais marqué plus haut:
Citation:
Est ce qu'à chaque fois "foreach" cherche si les méthodes current(),key(),rewind(),next() et valid() sont implémentées dans la classe qu'il doit itérer et si oui il les utilise??
Par contre est il possible de voir le code de la fonction php "foreach" ? Je voudrais voir exactement comment elle détecte la présence de l'implémentation d'Iterator sur la classe "MyIterator" et comment elle utilise les méthodes que l'on a défini
johnbenz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 09h39   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 133
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 133
Points : 8 493
Points : 8 493
Citation:
Envoyé par johnbenz Voir le message
Par contre est il possible de voir le code de la fonction php "foreach" ? Je voudrais voir exactement comment elle détecte la présence de l'implémentation d'Iterator sur la classe "MyIterator" et comment elle utilise les méthodes que l'on a défini
tout est dans la doc
http://www.php.net/manual/fr/class.i....example.basic
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 11h43   #5
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 661
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 661
Points : 5 388
Points : 5 388
Et aussi : Itération sur des objets
En pratique, si ta classe n'implémente pas Iterator, le foreach va parcourir tous les attributs visibles qu'il trouve.
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira 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 09h48.


 
 
 
 
Partenaires

Hébergement Web