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 :

Bonne pratique : Résolution de portée ou référence ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut Bonne pratique : Résolution de portée ou référence ? [résolu]
    Bonjour,

    je me pose une question de performance, par exemple tout le monde sait qu'il vaut mieux faire :
    $date = date("Y:s:i", time());
    puis utiliser plusieurs fois $date plutôt qu'executer inutilement plusieurs fois la fonction date() et time() dans cet exemple.

    Maintenant dans le cas d'un objet avec une résolution de porté :
    il vaut mieux utiliser plusieurs fois maClass::$objet->
    ou
    le déclarer une fois $objet =& maClass::$objet;
    puis utiliser plusieurs fois $objet->

    En fait j'ai peur que quand je fais maClass::$objet ça fait travailler PHP comme il le ferait avec une fonction() par exemple.
    Ce que j'espère et qui serait parfais c'est que PHP lit maClass::$objet comme si c'était une simple variable au lieu d'executer tout un tas de chose en fond.

    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Oulà ça c'est de la question.

    Je t'avouerai qu'autant il y a de sacrés beaux morceaux intéressants concernant l'optimisation du code et des temps d'exécution dans le manuel de la certification, autant cette idée là, je ne me souviens pas l'avoir vue.

    Personnellement je dirais que :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $objet =& maClass::$objet;$objet->actions();
    Vaut mieux que le
    Enfin c'est ce qui revient le plus dans les exemples d'utilisation du ZendFramework, je suppose que si ils font ainsi c'est qu'il y a une raison logique.

  3. #3
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Citation Envoyé par gwinyam Voir le message
    Enfin c'est ce qui revient le plus dans les exemples d'utilisation du ZendFramework, je suppose que si ils font ainsi c'est qu'il y a une raison logique.
    Pas bête mais bon ils leur arrivent de faire des erreurs d'optimisation qu'ils arrangent avec le temps...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    salut,

    Je reviens sur ce qui se disait plus haut.

    N'est ce pas le travail du compilateur que d'optimiser ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $a = MyClass::$maProp;
    $a->unefonction();
    Pour que se soit identique à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyClass::$maProp->unefonction();
    et inversement ?

    Et alors dans quelle mesure cela impacte la rapidité d'execution ?
    A priori faiblement puisque PHP à un système de cache, non ?

    Donc finalement, c'est se poser un faux problème que de se demander si telle ou telle syntaxe est la plus efficace ?

    Merci de vos éclaircissements car désormais j'ai le doute...,
    bye

  5. #5
    Membre confirmé
    Avatar de savageman86
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 105
    Par défaut
    Hum... La question de se demander si faire $a =& maClasse::$statique; puis d'utiliser $a n'est pas vraiment stupide dans le sens où la résolution de portée à été calculée une fois, puis stockée dans $a.

    Alors dans les utilisations de $a, plus besoin de re-résoudre le chemin vers la variable, donc gain de temps ?

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    @savageman86 : Oui, c'est bien cela, à la différence que l'opérateur =& n'a plus aucune utilité en PHP5, aucun avantage par rapport à l'opérateur =
    @kaymak : Non, PHP n'a pas de cache activé par défaut, il faut que tu choisisses toi-même l'extension de cache que tu veux utiliser.

  7. #7
    mon_nom_est_personne
    Invité(e)
    Par défaut
    il me semble qu'en matiere de performance et de scope la solution suivante est assez interessante.

    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
     
    class global_scope
    {
    static $variable1;
    ...
     
    static function func1()
    {
    //code de la fonction
    self::$variable1 = resultat du traitement;
    }
    global_scope::func1();
    echo global_scope::$variable1;
     
    }
    On peut ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $plus_simple_a_ecrire = global_scope::$variable1
    mais on perd la portee globale de l'instanciation static.

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Ta syntaxe MaClasse::$object me fait penser à une variable statique, est-ce bien le cas ? Dans l'affirmative, c'est aussi rapide que d'utiliser des références à l'objet.

    Au passage, je te rappelle qu'en PHP5 tous les objets sont des références, il est donc inutile d'utiliser =& pour l'instanciation. D'ailleurs, si comme tout le monde le recommande tu mets error_reporting=E_ALL|E_STRICT dans php.ini, tu devrais avoir des alertes visuelles à ce sujet

  9. #9
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    Salut,

    à bonne nouvelle !

    Bien vue, c'est une variable statique et parfois avec $var =& ...j'ai un message de PHP :
    Strict standards: Only variables should be assigned by reference in /le fichier en question...php

    En FR ça donne :
    Des normes strictes: Seules les variables devraient être assignées par référence dans /lefichier en question...php
    Parfois aucun message d'erreur si je l'utilise directement dans ma méthode &getInstance($class).

    Donc dans ce cas là aussi c'est inutile ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self::$objet[$class] =& new $class();
    Je n'avais pas activé l'option E_STRICT, je viens de la rajouter merci.

  10. #10
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Je te recommande de lire la doc à ce sujet, c'est très bien expliqué

  11. #11
    Membre confirmé Avatar de FrontLine
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 173
    Par défaut
    J'ai lu la doc toute l'après midi, du coté de new ça retourne automatiquement une référence depuis PHP5, ça le mérite d'être clair.

    Ce post et la lecture de plusieurs chapitres sur les classes et références de la doc de PHP m'ont éclairés ma lanterne. Cependant certains aspects concernant les références sont encore un peu flou.

    Désolé de faire le moulin à question, j'approche de la compréhension faut pas que je lâche lol

    A quel moment est-il judicieux d'utiliser une référence ?

    Ci-dessous ça ne sert à rien de dupliquer le contenu de MaClass::$var1 dans $var2, je pense donc qu'une référence plutôt qu'une copie est judicieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MaClass::$var1 = 'toutatime de contenu';
     
    function plouf($texte_en_plus)
    {
    $var2 =& MaClass::$var1;
    return $var2.$texte_en_plus;
    }
    Je me trompe ?

    Il y a t-il d'autres contextes où les références sont avantageuse ?

    Merci !

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ce que j'essaie de te dire depuis le début, est que depuis PHP5 l'opérateur "=&" est inutile. Il te suffit de faire "=", cela revient exactement au même. Si tu veux un duplicata de l'objet, l'opérateur "=" n'est pas suffisant, tu dois utiliser un clone.

Discussions similaires

  1. Bonnes pratiques de protections individuelles
    Par Community Management dans le forum Sécurité
    Réponses: 23
    Dernier message: 11/06/2024, 11h23
  2. Ouvrage de référence sur les bonnes pratiques pour le design d'un site
    Par Schim59 dans le forum Webdesign & Ergonomie
    Réponses: 0
    Dernier message: 24/07/2012, 08h43
  3. bonne pratique - référence d'instances
    Par Xoxocs dans le forum Général Python
    Réponses: 13
    Dernier message: 24/11/2009, 16h08
  4. Un guide de bonnes pratiques pour programmer avec le port COM ?
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/03/2008, 17h25

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