2010-06-16 3 views
0

J'ai mis une propriété dans un constructeur comme sipropriété ne mise à jour dans l'objet lorsque la page est affichée

function __construct() 
{ 

$this->count = count(@$_SESSION['filearray']); //count how many files in array 
} 

et l'utiliser dans les états de l'état if($this->count > 10) //then do something

, mais il semble que le compte est pas mis à jour quand j'utilise une autre méthode d'injection de valeurs dans ce 'filearray' jusqu'à ce que je rafraîchisse la page.

Est-ce que je fais quelque chose de mal? Je pensais que mon constructeur détecterait qu'un changement avait été fait dans la session et chaque fois que j'appellerais $ this-> count, j'obtiendrais la valeur de comptage actuelle, mais il semblerait qu'il y ait un pas de retard jusqu'à ce que je rafraîchisse la page.

Si cela est vague, je peux comprendre ma page de formulaire qui a tous les appels de méthode, mais c'est la jist de ma question, pourquoi ma propriété ne mise à jour et comment puis-je résoudre ce problème :)

TIA

+1

S'il vous plaît noter que l'aide de l'opérateur 'de @' est mauvaise forme et un coup de performance . Essayez 'array_key_exists ('filearray', $ _SESSION) && is_array ($ _ SESSION ['filearray'])? count ($ _ SESSION ['filearray']): 0; '- c'est plus bavard, mais il est libre des avertissements et des notifications que l'opérateur' @ 'cache. – Charles

+0

Merci pour le conseil Charles, je fais de mon mieux pour ne pas utiliser '@' mais parfois je suis fainéant pour l'ampleur du travail que je fais. Mais bon à savoir de toute façon, quelqu'un a besoin de faire un php astuces manuel :)/moi retourne à google – Jared

Répondre

2

$this->count ne sera pas automatiquement mis à jour avec le nombre chaque fois que vous ajoutez ou soustrayez de la session filearray. Les constructeurs ne sont invoqués que lors de l'instanciation de la classe ou lorsqu'ils sont appelés directement.

Vous pouvez obtenir ce type de fonctionnalité en utilisant un getter.

class myClass { 
    public function getCount() { 
    return count(@$_SESSION['filearray']); 
    } 
} 

$_SESSION['filearray'] = array('bar'); 
$foo = new myClass(); 
echo $foo->getCount(); // 1 

ou en utilisant le __get() magic-method:

class myClass { 

    public function __get($property_name) { 
    if ($property_name == 'count') { 
     return count(@$_SESSION['filearray']); 
    } 
    } 
} 

$_SESSION['filearray'] = array('bar'); 
$foo = new myClass(); 
echo $foo->count; // 1  

Ou une combinaison des deux:

class myClass { 

    private $_count; 

    public function __get($property_name) { 
    if ($property_name == 'count') { 
     return $this->_getCount(); 
    } 
    } 

    private function _getCount() { 
    return $this->_count = count(@$_SESSION['filearray']); 
    } 
} 

$_SESSION['filearray'] = array('bar'); 
$foo = new myClass(); 
echo $foo->count; // 1 
+0

merci qui a fait l'astuce mate, c'est seulement ma 2ème classe que j'ai écrit par moi-même donc toujours comprendre OOP :) – Jared

Questions connexes