J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

    Bonjour

    Petite question concernant l'usage de getInstance() sous J1.7 :

    Avec J1.5, ceci était parfaitement correct :
    Code PHP:
    if (!($row =& JTable::getInstance($tbl'Table'))) {
       
    JError::raiseWarning'1001''Table '.$tbl.' not supported');
    } else {              
       
    // Fait quelque chose

    $row est un pointeur vers JTable::getInstance() car, sous J1.5, la fonction est du type "public & function getInstance()" (http://docs.joomla.org/JTable::getInstance/1.5)

    Sous Joomla 1.7, toutes les fonctions getInstance sont devenues "public static function getInstance()" et donc, au lieu de retourner un pointeur, elle retourne l'objet. (http://docs.joomla.org/JTable::getInstance/1.6)

    L'instruction $row =& JTable::getInstance($tbl, 'Table') génère donc, et c'est normal, une erreur de type E_STRICT - Only variables should be assigned by reference.

    Si je supprime le caractère &, cela fonctionne évidemment mais dans ce cas, mon script consomme davantage de mémoire.

    Avez-vous été confronté à ce soucis ? Comment l'avez-vous solutionné ?

    Merci
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
    Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

  • #2
    Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

    Salut Chris, C'est lors d'un test en local que tu as constaté cette conso de ram ? Y a t'il un impact sur le temps de traitement ?( Tu m'épates de t'inquiéter de la ressource mémoire dédiée sur ton serveur d'hébergement !)@ plus,Marc.
    Dernière édition par liubov à 25/11/2011, 09h36
    Developper of JBreeding Manager: http://www.jbreeding.fr/
    J-cook Referral : Service Générateur d'Extensions pour Joomla

    Commentaire


    • #3
      Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

      Bonjour

      Je désesperais... Personne ne répond jamais à mes posts

      Sous Joomla 1.5, tu as quantité de fonctions de l'API qui retourne non pas l'objet mais un pointeur vers l'objet (=fonctions déclarées avec un &). Si, en J1.5, tu déclares une variable $row comme ci-dessous rédigée, $row va contenir un double de la définition de la table déjà chargée.
      Code PHP:
      $row JTable::getInstance($tbl'Table'
      Sous J1.7, JTable::getInstance ne retourne plus un pointeur mais est définie de type statique.

      Ce qui m'ennuie, c'est qu'en développement en mode error_reporting (E_ALL), j'ai plusieurs erreurs de type E_STRICT avec mes lignes où j'utilise des =&

      Code PHP:
      $row =& JTable::getInstance($tbl'Table'
      Ceci parce que getInstance ne retourne plus un pointeur.

      Je pourrais corriger l'erreur avec le code ci-dessous

      Code PHP:
      if(version_compare(JVERSION,'1.6.0','ge')){
      $row JTable::getInstance($tbl'Table');
      } else {
      $row =& JTable::getInstance($tbl'Table');

      mais je ne me vois pas faire ça pour les centaines d'assignation =& que j'ai. Il y a forcément un truc; pas encore trouvé pour l'instant.

      (Pour l'heure, temporairement, j'ai désactivé les erreurs E_STRICT)


      Envoyé par liubov Voir le message
      Tu m'épates de t'inquiéter de la ressource mémoire dédiée sur ton serveur d'hébergement
      Oui et non. Il est important pour moi de proposer un logiciel de qualité; sinon à quoi bon ?

      La gestion des erreurs/warnings ainsi que la mémoire fait partie de ces critères.

      Ainsi, p.e. en local, j'ai mis mon memory_limit à 22MB. Et je gère les fatal error qui résultent de cette limitation
      Christophe (cavo789)
      Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
      Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

      Commentaire


      • #4
        Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

        Bonjour,
        Envoyé par cavo789 Voir le message
        Sous Joomla 1.5, tu as quantité de fonctions de l'API qui retourne non pas l'objet mais un pointeur vers l'objet (=fonctions déclarées avec un &). Si, en J1.5, tu déclares une variable $row comme ci-dessous rédigée, $row va contenir un double de la définition de la table déjà chargée.
        Code PHP:
        $row JTable::getInstance($tbl'Table'
        Vrai et Faux en même temps. J!1.5 ayant été conçu à l'origine pour PHP 4, la syntaxe
        Code PHP:
        $row =& JTable::getInstance($tbl'Table'
        permettait d'obtenir une référence (pas un pointeur au sens propre, mais plus ou moins un équivalent), la gestion des objets en PHP 4 étant quelque peu chaotique et indigeste.

        En PHP 5, un objet est toujours une référence, PHP 5 retournant lors d'un new uneClasse() un nombre unique, l'object_id interne.
        Du coup en PHP5,
        Code PHP:
        $row =& JTable::getInstance($tbl'Table'
        est devenu une référence de référence ! Jusque PHP 5.3, cet empilement n'était pas signalé, le mode STRICT n'étant pas vraiment au point jusque PHP 5.2.

        Envoyé par cavo789 Voir le message
        Sous J1.7, JTable::getInstance ne retourne plus un pointeur mais est définie de type statique.

        Ce qui m'ennuie, c'est qu'en développement en mode error_reporting (E_ALL), j'ai plusieurs erreurs de type E_STRICT avec mes lignes où j'utilise des =&

        Code PHP:
        $row =& JTable::getInstance($tbl'Table'
        Ceci parce que getInstance ne retourne plus un pointeur.
        La gestion en J!1.7 est correcte, puisque l'on utilise un singleton, la méthode getInstance() doit logiquement être de type static et getInstance retourne bien une référence à l'objet.
        E_STRICT t'indique donc, le plus logiquement du monde, qu'il n'est vraiment pas bien de créer une référence de référence, certains effets de bord indésirables (erreur sur le décompte des références à l'objet entre autres) pouvant survenir.

        Envoyé par cavo789 Voir le message
        mais je ne me vois pas faire ça pour les centaines d'assignation =& que j'ai. Il y a forcément un truc; pas encore trouvé pour l'instant.

        (Pour l'heure, temporairement, j'ai désactivé les erreurs E_STRICT)
        Bien qu'on puisse, en désactivant E_STRICT, avoir un code tournant en logique PHP4 de J!1.5 et en mode logique PHP5, le problème se posera forcément un peu plus tard, par exemple avec l'arrivée de PHP 5.4 ou 5.5, où certaines antiques pratiques, marquées comme deprecated depuis PHP 5.0, seront carrément supprimées. Le code devra, par force, être conforme à ce moment.

        Envoyé par cavo789 Voir le message
        Ainsi, p.e. en local, j'ai mis mon memory_limit à 22MB. Et je gère les fatal error qui résultent de cette limitation
        Louable intention
        Pas de demande de support par MP.
        S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

        Commentaire


        • #5
          Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

          oui, j'avais bien vu que la méthode n'était plus la même.
          Tu n'as rencontré que ça comme différence compat dans ton code, entre 1.5 et 1.7 ?
          Perso j'ai du modifier quand même pas mal de choses; Les appels Mainframe, Jfactory, Filters... pas mal de "petits" changements à adapter.

          Voila comment j'ai codé en 1.7 pour récupérer la donnée. ça ne génére pas d'erreur E_STRICT.

          Code PHP:

            $row 
          =& $this->getTable();
            
            
          //Convert data from a stdClass
            
          if (get_class($data) == 'stdClass')
             
          $data JArrayHelper::fromObject($data); 
          Est ce que ça répond à ta question?
          Dernière édition par liubov à 25/11/2011, 11h06
          Developper of JBreeding Manager: http://www.jbreeding.fr/
          J-cook Referral : Service Générateur d'Extensions pour Joomla

          Commentaire


          • #6
            Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

            Merci Jisse.

            Donc, sous J1.5, que je code
            Code PHP:
            $row =& JTable::getInstance($tbl'Table'); 
            ou
            Code PHP:
            $row JTable::getInstance($tbl'Table'); 
            est strictement identique quand à la consommation mémoire ?

            Je pourrais donc dès à présent supprimer tous les =& qui se trouvent dans mon code. Aucun effet de bord ?
            Christophe (cavo789)
            Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
            Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

            Commentaire


            • #7
              Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

              Envoyé par cavo789 Voir le message
              Merci Jisse.

              Donc, sous J1.5, que je code
              Code PHP:
              $row =& JTable::getInstance($tbl'Table'); 
              ou
              Code PHP:
              $row JTable::getInstance($tbl'Table'); 
              est strictement identique quand à la consommation mémoire ?

              Je pourrais donc dès à présent supprimer tous les =& qui se trouvent dans mon code. Aucun effet de bord ?
              Puisque quasiment plus personne ne supporte PHP4, et que AllEvents requiert PHP 5.2 au minimum, tu peux sans risque les supprimer, puisque de toute manière, c'est une référence à l'objet qui est retournée. Il n'y a aucune incidence notable sur la consommation mémoire.
              Pas de demande de support par MP.
              S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

              Commentaire


              • #8
                Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                Envoyé par liubov Voir le message
                Tu n'as rencontré que ça comme différence compat dans ton code, entre 1.5 et 1.7 ? ... Les appels Mainframe, Jfactory, ...
                entre autre mais aussi le code mootools, l'ajax, le paramètrage des vues, la récupération des paramètres, ...

                Beaucoup de choses mais vu que je programme avec beaucoup d'objets perso, je modifie le code à un endroit et cette modif. est répercutée rapidement.

                Envoyé par liubov Voir le message
                $row =& $this->getTable();

                //Convert data from a stdClass
                if (get_class($data) == 'stdClass')
                $data = JArrayHelper::fromObject($data);[/PHP]
                C'est dans un modèle ça non ? Je n'en utilise aucun; j'ai abandonné le M de MVC en passant à AllEvents.

                Merci pour ta réponse; entretemps Jisse me confirme que je peux virer =& et remplacer par =

                Un search&replace; cool

                Envoyé par jisse03 Voir le message
                que AllEvents requiert PHP 5.2 au minimum
                5.1 au minimum (afin de tourner sur Free).

                Merci pour ta confirmation; me voilà rassuré.
                Christophe (cavo789)
                Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                Commentaire


                • #9
                  Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                  Bonjour,
                  Envoyé par liubov Voir le message
                  Voila comment j'ai codé en 1.7 pour récupérer la donnée. ça ne génére pas d'erreur E_STRICT.

                  Code PHP:

                    $row 
                  =& $this->getTable();
                    
                    
                  //Convert data from a stdClass
                    
                  if (get_class($data) == 'stdClass')
                     
                  $data JArrayHelper::fromObject($data); 
                  Est ce que ça répond à ta question?
                  Là, la référence ne génèrera pas d'erreur E_STRICT, puisqu'on récupère le résultat d'une méthode de l'objet lui-même.
                  Pas de demande de support par MP.
                  S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

                  Commentaire


                  • #10
                    Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                    Merci Jisse,
                    on aura encore appris un truc, jusqu'a la prochaine question de Cavo .
                    Marc.
                    Developper of JBreeding Manager: http://www.jbreeding.fr/
                    J-cook Referral : Service Générateur d'Extensions pour Joomla

                    Commentaire


                    • #11
                      Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                      Envoyé par cavo789 Voir le message
                      5.1 au minimum (afin de tourner sur Free).
                      Attention au 5.1, il y avait divers bugs, dont un très ennuyeux bug de fuite mémoire avec foreach sur le tableaux..
                      Pas de demande de support par MP.
                      S'il n'y a pas de solution, c'est qu'il n'y a pas de problème (Devise Shadok)

                      Commentaire


                      • #12
                        Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                        Envoyé par cavo789 Voir le message
                        C'est dans un modèle ça non ? Je n'en utilise aucun; j'ai abandonné le M de MVC en passant à AllEvents.
                        Dans ta réécriture de ton composant pour 1.7, c'est étonnant que tu t'éloignes volontairement du standard que joomla1.7 impose ou cherche à imposer à tous ces applicatifs ??? ...

                        @ plus,
                        Marc.
                        Developper of JBreeding Manager: http://www.jbreeding.fr/
                        J-cook Referral : Service Générateur d'Extensions pour Joomla

                        Commentaire


                        • #13
                          Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                          Sous J1.5, je n'aimais vraiment pas les modèles parce que cela t'obligeait à déclarer ton code SQL à plusieurs endroits.

                          Tu as un modèle Truc et un modèle Machin qui tout deux devaient récupérer la liste des records d'une même table : soit tu écrivais le code deux fois (beurk), soit tu écris une petite fonction que tu appelles.

                          Dans l'idée de cette fonction, j'ai ajouté dans mes tables de classes des fonctions ChargerLesEvenements, ChargerLesAgendas, etc et puis, ces fonctions-là, sont appelées depuis non pas des modèles mais des classes : j'ai une classe Evènement, une classe Agenda, etc.

                          Et ... et ... à quoi sert les modèles dès lors qu'ils ne font plus qu'appeler des classes ? Autant tout faire dans une classe non ?

                          Grosso modo :
                          Code PHP:
                          $agenda = new Agenda();
                          $data $agenda->ChargerLesAgendas();
                          unset(
                          $agenda); 
                          Et ce code, tu l'appelles n'importe où, vues, controlleurs, autres objets, ...

                          Problablement m'y étais-je pris comme un manche quand j'ai conclus que les modèles, c'était pas terrible. C'était quelques mois après avoir commencé SportingEvents et mon niveau php / joomla laissait encore fortement à désirer.

                          Note : le MVC n'est qu'une norme; pas une obligation. Je connais au moins un autre développeur qui n'utilise pas les modèles et c'est un dév. d'un composant incontournable
                          Christophe (cavo789)
                          Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                          Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                          Commentaire


                          • #14
                            Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                            Je sais! ça commence par un A ... et ça fini par un G, pour le nom du Comp !
                            Et il était avec nous en Avril, au JDAY.

                            Ce que tu dis se défend, et c'est vrai pour les query sql, des fois j'ai un enchainement de 5 ou 6 requetes, mais bon, pour moi, c'est bien là qu'elle doivent être.
                            Mon approche est différente, car je suis monté en compétence sur le dev Joomla1.5, uniquement en m'intéressant dès le départ au concept MVC, et aux exemples qui respectaient cela.
                            Je trouve agréable (dans le model) de pouvoir s'appuyer sur ses methodes, fonctions,... toutes définies, pour un code hyper light à la finale, quelquesoit la densité des données qu'on manipule.
                            Chacun sa vision, quoi.

                            Bonne continuation.
                            Marc.
                            Developper of JBreeding Manager: http://www.jbreeding.fr/
                            J-cook Referral : Service Générateur d'Extensions pour Joomla

                            Commentaire


                            • #15
                              Re : J1.5 => J1.7 : Objet::&getInstance() est devenu Objet::getInstance()

                              Envoyé par liubov Voir le message
                              Je sais! ça commence par un A ... et ça fini par un G, pour le nom du Comp !
                              En effet ! Excellente mémoire
                              Christophe (cavo789)
                              Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
                              Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X