Getter/Setter simple sans __get et __set

ViPHP
ViPHP | 3300 Messages

19 oct. 2010, 21:26

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();
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 5462 Messages

19 oct. 2010, 21:29

pourquoi tu fais un foreach ?

Mammouth du PHP | 19672 Messages

19 oct. 2010, 22:13

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 5462 Messages

19 oct. 2010, 23:05

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:

ViPHP
ViPHP | 3300 Messages

20 oct. 2010, 01:05

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 :)
Fait du php depuis que ca existe ou presque :)