2010-09-13 3 views
0

Im » se demander si cela est possible:__set et concaténation de chaînes

J'ai __set utilisé avec succès() méthode magique pour définir les valeurs des propriétés d'une classe:

class View 
{ 
    private $data; 

    public function __set($key, $value) 
    { 
     $this->data[$key] = $value; 
    } 
} 

Je suis en mesure à:

$view = new View(); 
$view->whatever = 1234; 

Le problème vient quand je veux concaténer une chaîne par exemple. Il semble que __set() ne soit pas appelé (il n'est pas appelé en fait).

$view = new View(); 
$view->a_string = 'hello everybody'; //Value is set correctly 

$view->a_string.= '<br>Bye bye!';  //Nothing happens... 

echo $view->a_string; 

Cela affiche "bonjour tout le monde". Je ne suis pas capable d'exécuter __set() dans la seconde affectation. lecture php.net il est dit que:

__set() is run when writing data to inaccessible properties. 

Afin a_string existe déjà, __set n'est pas appelé. Ma question est finalement ... comment pourrais-je réaliser cette opération de concaténation?

Note: Ok ... Murphy est venu et m'a donné la réponse dès que je posté ...

La réponse (Comme je l'ai compris), est que PHP ne peut pas décider si a_string est disponible car je n'ai pas défini de méthode __get().

La définition de __get() permet à php de trouver la valeur actuelle de a_string, puis utilise __set() pour concaténer la valeur.

Répondre

4

Vous devez ajouter une méthode __get() qui vous permet d'accéder aux propriétés inaccessibles comme vous l'avez fait avec __set(). Vous pouvez ensuite effectuer les opérations suivantes:

$view->myvar = $view->myvar.'Added text.'; 

La méthode __get() serait:

public function __get($var) { 
    return (isset($this->data[$var])) ? $this->data[$var]: ''; 
} 
+0

Oui, j'ai vu cela après avoir modifié mon post. –

+0

Je dois avoir laissé tomber ceci juste comme vous l'éditiez. –

+1

Sur une note de côté: retourner NULL plutôt qu'une chaîne vide semble plus approprié. – Wrikken

0

C'est parce que __set() est une méthode et non une chaîne. Si vous voulez qu'il «agisse» comme une chaîne, vous pouvez le changer.

class View 
{ 
    private $data; 

    public function __set($key, $value) 
    { 
     if (empty($this->data[$key])) { 
      $this->data[$key] = $value; 
     } else { 
      $this->data[$key] .= $value; 
     } 
    } 
} 
1

FYI, pour une affectation simple, les méthodes magiques ne sont même pas nécessaires.

class A { 

} 

$a = new A(); 

$a->str = '1'; 
$a->str .= '2'; 
echo $a->str; // outputs 12 

Cela fonctionnera très bien car PHP va créer les nouvelles propriétés grâce à l'affectation. __set/get est généralement utilisé lorsque des vérifications/codes supplémentaires doivent être exécutés sur les valeurs.

+0

J'ai besoin de la méthode magique ici car je dois absolument stocker les données dans le membre $ data. –

Questions connexes