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 :

[POO] Surcharge d'attributs PHP <= 5.0.3


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [POO] Surcharge d'attributs PHP <= 5.0.3
    Bonjour,

    Problème sérieux en vue ! J'ai transféré mon système de gestion sur un serveur tier ce matin (pour test avant mise en production) et là, la conséquence imprévue..., PHP emet une erreur fatale, les attributs privés ne peuvent pas être modifiés directement...

    Pourtant j'ai implémenté les méthodes __get et __set pour outrepasser la chose dans toutes les classes concernées, et je n'ai aucune problème sur mes serveurs, dont la version la moins récente de PHP est la 5.1.2...

    Je me demandais donc si PHP 5.0.3 (c'est la version installée sur le maudit serveur) pouvait être à l'origine du problème ?

    Ou si quelqu'un a eu la même curiosité ?

    Dans le pire des cas je vais devoir me taper un "Recherche - Remplacer" global en changeant les attributs private en public, ce n'est pas grand chose à faire, mais ça fausse tout mon travail...

    Merci à toute lueur...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jeff_!
    Salut Jeff !

    Merci pour ton lien, j'espère que ce n'est pas ce bug récurant... Je vais essayer de faire d'autres tests de surcharge, mais je comprend pas, il n'y est pas sensé avoir de problème puisque ces méthodes ont été implémentées nativement à PHP 5...


    Super matinée en perspective...


    A plus

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    j'ai commencé avec php5.04 et ca marche

  5. #5
    Invité
    Invité(e)
    Par défaut
    Apparament le serveur veut vraiment rien savoir, à tous les coups il me balance l'erreur fatale :


    Fatal error: Cannot access private property MyClass::$myVa...

    Les méthodes de surcharge ressemblent à ça :
    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
    
          public function __get($property)
          {
                 if (!is_null($this->$property)) {
                       return $this->$property;
                }
                
                 return NULL;
          }
           
          public function __set($property, $value)
          {
                if (isset($property)) {
                      $this->$property = $value;
                }
          }
    
    T'as pas une idée ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Apparament, il ne s'agirait pas d'un bug selon :
    http://bugs.php.net/bug.php?id=34893
    ...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    je dirais bien que tu est dans le meme situation
    un probleme de reference

    fait un dump (ou echo)de ton objet et de l'autorefence pour voir
    , en d'autre terme il faudrai faire evoluer la version de php
    ou metre une rustine
    au attend est ce que le mode compatibilté avec le zend engine 1 est activé
    car on repasse au systeme de reference de php4

  8. #8
    Invité
    Invité(e)
    Par défaut
    Selon la page citée plus haut, les Getters et Setters ont été créés initialement dans le seul but de surcharger des attributs qui ne sont pas déclarés dans la classe (comme __call pour les méthodes)...

    Le fait qu'ils puissent être appliqués sur des attributs déclarés ne relève pas de leur rôle initial...

    C'est pas clair.

    J'ai vérifié du coté du Zend Engine, c'est le 2.0.3 qui est utilisé, il n'y a rien de particulié concernant une éventuelle compatibilité Zend Engine 1 / PHP 4... Quoi que, je ne sais pas si la directive figure ailleurs que dans le phpinfo() ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Malheureusement il s'agit d'un serveur mutualisé dont je n'ai pas le contrôle, sans quoi j'aurai logiquement compilé la toute dernière version de PHP 5 avant de faire quoique ce soit d'autre...

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    Selon la page citée plus haut, les Getters et Setters ont été créés initialement dans le seul but de surcharger des attributs qui ne sont pas déclarés dans la classe (comme __call pour les méthodes)...
    ou en theorie mais chez moi ca a toujours bien fonctionner

    au fait c'est le setter ou le getter qui envoi une erreur

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ouais, mais je pense que je vais passer tous les attributs en public, ça simplifira les choses même si ce n'est pas la pratique préconisée...

    Ou sinon, je crée des méthodes "accesseurs" pour chaque variable, mais là j'en aurai pour les trois prochains jours...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jeff_!
    au fait c'est le setter ou le getter qui envoi une erreur
    Les deux...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    sinon tu utilise __get et __set a tester

  14. #14
    Invité
    Invité(e)
    Par défaut
    Enfaite c'est justement __get et __set qui ne fonctionne pas, et c'est tout bonnement normal

    Citation Envoyé par Manuel PHP
    Surcharge

    Les appels de méthodes et l'accès aux membres peuvent être surchargés via les méthodes __call(), __get() et __set(). Ces méthodes ne seront déclenchées que si votre objet, hérité ou non, ne contient pas le membre ou la méthode auquel vous tentez d'accéder.
    Beaucoup de monde répend l'idée qu'on puisse ce servir de ces méthodes magiques pour affecter ses attributs déclarés... C'est une grosse aberration, elles ne sont pas faites pour ça...

    J'aurais mieux fait de m'écouter et de continuer à créer machinalement mes accesseurs... .

    On m'y reprendra plus !

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    pourtant j'aurai jurée l'avoir fai

    en tout cas maintenant je m'en sert surtout pour appeler d'autre objets et c'est vachement pratique

  16. #16
    Invité
    Invité(e)
    Par défaut
    Ce qui est bizzare quand même, c'est que ça puisse fonctionner alors que ce n'est pas prévu pour... Usine à gaz !

    Y'a de quoi aller s'acheter une corde !!!

  17. #17
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Malheureusement tu est surement victime d'un problème de résolution (Je ne sais pas si c'est le nom nom).
    J'ai eu un problème un peu similaire l'autre jour.

    ce qui doit se passer c'est comme tes classes ont le même nom pour l'accesseur publique et l'acceseur privée, PHP essaie d'accéder directement à la propriété .... privée. donc une erreur se produit.

    Pour éviter sa j'ai pris l'habtitude de toujours préfixé mes attributs privés de p_.

    Mais la tu ne vas pas t'amuser...

  18. #18
    Invité
    Invité(e)
    Par défaut
    Ben enfaite, le perfectionniste que je suis est parti pour repasser en revue quelque chose comme 2000 lignes de code...

    Mais bon, je suis entrainé mentalement à ce genre d'éventualité mdr, et ça pourrait être le triple si l'héritage n'existait pas !...

Discussions similaires

  1. [POO] Objet en attribut d'un objet
    Par Tchinkatchuk dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 10h00
  2. [POO] Surcharge d'opérateurs []
    Par Amnesiak dans le forum Langage
    Réponses: 28
    Dernier message: 11/11/2005, 12h44
  3. [POO] langage objet et php.
    Par FFF dans le forum Langage
    Réponses: 15
    Dernier message: 09/11/2005, 18h36
  4. [POO] Heritage d'attribut statique surchargé !
    Par Jaxofun dans le forum Langage
    Réponses: 25
    Dernier message: 16/08/2005, 09h01
  5. Réponses: 3
    Dernier message: 23/08/2004, 17h49

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