Forum Programmation.php POO pour les gourous du PHP

Posté par  .
Étiquettes : aucune
0
19
juil.
2004
Bonjour à tous,

je souhaitais faire un petit test rapide. J'ai donc écrit ce code :


<?php
error_reporting(E_ALL);


class Page
{
var $a = 0;
function get()
{
$me = Page::instance();
return $me->a;
}

function set($value)
{
$me = Page::instance();
$me->a = $value;
}

function & instance ()
{

static $instance = false;

if (!$instance)
{

$instance = new Page ();
}

return $instance;

}
}

echo Page::get()."< br >";
Page::set(3);
echo Page::get()."< br >";
?>



A l'execution, j'obtiens :
0
0

==> conclusion, la variable $a n'est pas modifié par la fonction set()

Ma première idée a été de vérifié que instance() ne re-créait pas l'objet à chaque appel.
==> La fonction instance() ne créer pas un nouvel objet à chaque fois qu'elle est appeler. (j'ai fait un simple echo() dans le if pour vérifier)

Je ne sais vraiment pas d'où peut venir ce problème. J'espère que ce n'est pas une erreur grossière.

Merci.

PS : la fonction instance() est issue du projet Copix, elle est vraiment pratique. Elle permet d'utiliser une classe tout en se passant de la création d'un objet.
  • # Peut-être que.......

    Posté par  (site web personnel) . Évalué à 1.

    Il me semble qu'il fasse faire
    $page=new Page;
    et utiliser $page->set(3)
    apres
    peut-etre que je me trompe
    et peut-etre que t'utilises php5 qui a peut etre changé
    ou alors tu peux aussi faire si j'ai bien compris le code
    $page=Page::instance();
    $page->set(3);
    Je ne suis sur de rien la dedans faut tester :)
    • [^] # Re: Peut-être que.......

      Posté par  (site web personnel) . Évalué à 1.

      Ah ui et aussi
      function set($value)

      {

      $me = Page::instance();

      $me->a = $value;

      }
      j'sui pas sur que ca marche
      tu changes la class que t'as copié dans la variable $me
      mais pas l'original avec ca
      d'ailleurs pk faire ca?
      cette "variable" existe deja
      elle s'appelle $this
      et est initialisé par defaut
      donc tu peux viré une ligne pour mettre juste:
      $this->a=$value;
      voir meme tt simplement
      $a=$vaulue;
      (comme mon commentaire au dessus je dis ptet une connerie)
      • [^] # Re: Peut-être que.......

        Posté par  . Évalué à 2.

        Pour commencer, il est vrai que j'ai oublié de préciser que j'utilise PHP4, je m'en excuse.

        L'intérêt de cette méthode reside dans l'inutilité de déclarer l'objet.

        Cela permet de s'assurer qu'aucun attribut ne peut être modifié par la page qui appelle la classe.

        Et j'aime bien la présentation, je m'en sert pour programmer des plugins pour le site.

        Concretement, au lieux de ça (par exemple) :
        $date = new Date();
        $date->forme('d m Y');
        $date->affiche();

        je peux écrire ça :
        Date::forme('d m Y');
        Date::affiche();

        Et dans le deuxième cas, impossible d'aller modifié un attribut sans passer par une fonction ( set() par exemple. )

        Pour le problème qui m'occupe, je viens de trouver la solution grace à ta suggestion :
        tu changes la class que t'as copié dans la variable $me
        mais pas l'original avec ca


        Il faut donc remplacer :
        $me = Page::instance();

        par
        $me =& Page::instance();


        Merci bien.
  • # euhhh

    Posté par  . Évalué à 1.

    soit j'ai mal compris...
    soit cela suffit:


    function get() {
    return $this->a;
    }

    function set($a) {
    $this->a = $a;
    }
    • [^] # Re: euhhh

      Posté par  . Évalué à 2.

      En faites non.

      Puisque l'on utilise cette syntaxe : Page::get()

      L'objet n'est pas déclaré. Donc $this n'est pas assigné.
      • [^] # Re: euhhh

        Posté par  . Évalué à 1.

        ok merci... je me disais bien qu'il y avait un truc.
        En même temps c'est un peu "pas propre" non ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.