Page 1 sur 1

Getter/Setter simple sans __get et __set

Posté : 19 oct. 2010, 21:26
par Nagol
Un petit bout de code tout simple fait en 10 minutes qui permet de faire des get/set sur un objet simplement en étant insensible à la casse le vrai code est le contenu de la function __call, ça ne fonctionne évidemment qu'en PHP5.

Code : Tout sélectionner

class test { public $toto; public function __construct() { $this->TotO = 0; } public function __call($method, $value) { $cmd = strtolower(substr($method, 0, 3)); $prop = strtolower(substr($method, 3)); $props = array_keys(get_object_vars($this)); if($cmd == 'set') { foreach($props as $test) { if(strtolower($test) == $prop) { $this->{$test} = $value[0]; break; } } } if($cmd == 'get') { foreach($props as $test) { if(strtolower($test) == $prop) { return $this->{$test}; } } } } }
Pour la tester:

Code : Tout sélectionner

$test = new test; $test->setTOTO(7); echo $test->getToTo();

Re: Getter/Setter simple sans __get et __set

Posté : 19 oct. 2010, 21:29
par stealth35
pourquoi tu fais un foreach ?

Re: Getter/Setter simple sans __get et __set

Posté : 19 oct. 2010, 22:13
par Cyrano
pourquoi tu fais un foreach ?
Pour être sûr que ça ne concerne que les propriétés de la classe.
get_object_vars

(PHP 4, PHP 5)

get_object_vars — Retourne les propriétés d'un objet
Donc on obtient un tableau contenant les propriétés définies dans l'objet.

Re: Getter/Setter simple sans __get et __set

Posté : 19 oct. 2010, 23:05
par stealth35
y'a property_exists pour ca, au pire un in_array aurait fait l'affaire, sinon si on met pas de valeur dans le set il aime pas c'est moment pour lancer une BadMethodCallException :wink:

Re: Getter/Setter simple sans __get et __set

Posté : 20 oct. 2010, 01:05
par Nagol
y'a property_exists pour ca, au pire un in_array aurait fait l'affaire, sinon si on met pas de valeur dans le set il aime pas c'est moment pour lancer une BadMethodCallException :wink:
Le seul soucis pour les in_array ou property_exists, c'est que comment on fait du case insensitive avec? :) ben on peut pas... sinon pour le check d'erreur certes j'ai rien fait, c'est du code fait en 10 minutes, y'a matière à customizer :)