IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

class::method() : réorthographié comme array ? [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut class::method() : réorthographié comme array ?
    Je cherche en vain dans le manuel php, l'explication de la syntaxe que j'ai rencontrée plusieurs fois pour une method dans un argument : exemple

    register_shutdown_function(array(&$this, "shutdown"));

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    class destruction {
        var $name;
     
        function __construct($name) {
            $this->name = $name;
            register_shutdown_function(array(&$this, "shutdown"));
        }
     
        function shutdown() {
            echo 'shutdown: '.$this->name."\n";
        }
     
        function __destruct() {
            echo 'destruct: '.$this->name."\n";
        }
    }
     
    $a = new destruction('a: global 1');
     
    function test() {
        $b = new destruction('b: func 1');
        $c = new destruction('c: func 2');
    }
    test();
     
    $d = new destruction('d: global 2');
     
    ?>
     
    this will output:
    shutdown: a: global 1
    shutdown: b: func 1
    shutdown: c: func 2
    shutdown: d: global 2
    destruct: b: func 1
    destruct: c: func 2
    destruct: d: global 2
    destruct: a: global 1
    ?>
    Si je remplace l'argument (array($this, "shutdown")) par (destruction::shutdown()), le code ne renvoie aucune erreur.

    S'agirait-il donc d'une syntaxe alternative, (array($this, "method")) ou (class::method()) ?

    Savez vous sous quelle rubrique je pourrais trouver l'explication de cette syntaxe?

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    le & est une référence. Un exemple ici

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Ne faudrait il pas que la méthode "shutdown" soit statique ?

    Puis tu définie que tu est en Php5.2, mais tu utilise une syntaxe Php4 ?
    Pourquoi ne pas coder en Php5 ?

    Donc si on défini cette méthode statique, faudra alors l'appliquer à la propriété "name" aussi.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class destruction {
        public static $name;
     
        public function __construct($name) {
            self::$name = $name;
            register_shutdown_function(array('destruction', 'shutdown'));
        }
     
        public static function shutdown() {
            echo 'shutdown: '.self::$name."\n";
        }
     
        public function __destruct() {
            echo 'destruct: '.self::$name."\n";
        }
    }
    A essayer.


    Aussi, il me semble que cette fonction register_shutdown_function() est faite pour définir une fonction (ou méthode d'une classe) qui sera exécutée lorsque que le script est stoppé prématurément, avec un exit() notamment.

    Je ne suis pas certain que tu le perçois avec les essais.

  4. #4
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Oui, je sais que & est une référence et register_shutdown_function est appelé quand le script est stoppé prématurément (avant le destructor). L'exemple est issu du manuel php et ne pose pas de problème. C'est moi qui ne comprends pas bien cet usage de & devant $this et cette apparente équivalence entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    register_shutdown_function(array(&$this, "shutdown")); et 
    register_shutdown_function(destruction::shutdown());
    Quelle est le rôle de & devant une une classe (&$this)?

    C'est ça aussi qui n'est pas encore limpide pour moi...

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Le & est fait pour déclarer qu'un élément (variables, tableau, Objet) sera une référence.
    Ca se voit (ou ce fait) dans les fonctions tout particulièrement.
    Exemple pour la fonction sort() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
    Mais depuis Php5 les Objets passent par références, donc rajouter un & devant un objet ça fait doublon.
    Du coup, ceci déprécié, et ça provoque un Warning (ou autre erreur).
    Faut pas le faire pour les Objets.


    Si tu vois cette syntaxe encore, alors le support n'est plus à jours, et depuis longtemps car Php5 ça commence à dater tout de même.


    Donc si tu enlève le &, ça devrait fonctionner.

  6. #6
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Effectivement l'auteur de l'ex. mentionne php 5.2.1.
    Merci pour tes informations !

    reste la question de la syntaxe de l'argument de la function avec array... Je l'ai aussi trouvée dans un autre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    usort($animals, array("Animal","compare"));
    où Animal est une classe et compare le nom d'une function, ce qui correspond à Animal::compare(). D'où vient donc cette syntaxe avec array?

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    D'où vient donc cette syntaxe avec array?
    J'en sais rien, j'ai tendance à dire que c'est les gars de Php qui l'ont voulu comme ça, faut juste le savoir.

    Ce serait propre au paramètre callback, qui donc accepterait soit une chaine, le nom d'une fonction (une simple fonction), soit un tableau, et dans celui ci ce sera le nom de la fonction et le nom de la méthode.
    Voir la Doc Php : type callback


    Donc si je ne dis pas de bêtise, toutes les fonctions Php qui acceptent comme argument un type "callback" pourront soit faire appel à une fonction, soit une méthode de classe (via un tableau).
    Très pratique finalement.

  8. #8
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Voir la Doc Php : type callback
    Ton lien donne la réponse :
    "Une méthode d'un objet instancié est passée comme étant un tableau, contenant un objet à l'index 0 et le nom de la méthode à l'index 1."

    Il suffisait de lire le manuel...ce qui n'est évident que quand on arrive à circuler dedans, ce qui suppose qu'on s'y soit déjà beaucoup perdu...

  9. #9
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Il est tout à fait possible d'utiliser une méthode d'instance comme callback, il faut passer un type objet au lieu d'un type string en index 0 du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    class destruction {
        public $name;
     
        public function __construct($name) {
            $this->name = $name;
            register_shutdown_function(array($this, 'shutdown'));
        }
     
        public function shutdown() {
            echo 'shutdown: '.$this->name."\n";
        }
     
        public function __destruct() {
            echo 'destruct: '.$this->name."\n";
        }
    }
    $this étant un objet de type destruction, il est automatiquement passé par référence.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/02/2007, 15h13
  2. [Tableaux] methode post et array ..
    Par Adren dans le forum Langage
    Réponses: 10
    Dernier message: 29/07/2006, 00h41
  3. [Langage][Classe][Methode]Comment récuperer les arguments d'une fonction ?
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/07/2006, 16h06
  4. Super classes et sous-classes/Méthodes
    Par smag dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 23h10
  5. [Exception]Connaitre la pile d'appel de classes/méthodes
    Par salome dans le forum Général Java
    Réponses: 2
    Dernier message: 19/03/2005, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo