2010-06-08 2 views
3

J'ai deux ou trois tableauxEst-il possible de générer automatiquement Getter/Setter à partir de valeurs de tableau en PHP?

$array_1 = Array('one','two','three'); 
$array_2 = Array('red','blue','green'); 

est-il un moyen dynamique pour créer les Setters et Getters pour un tableau avec des entrées de valeur unique?

Ainsi, la classe serait quelque chose comme:

class xFromArray() { 

} 

Donc ce qui précède, si je passais $ array_1 il générerait quelque chose comme ceci:

private $one; 

setOne($x) { 
    $one = $x; 
} 

getOne() { 
    return $one; 
} 

si je passais $ array_2 il générerait quelque chose comme ceci:

private $red; 

setRed($x) { 
    $red = $x; 
} 

getRed() { 
    return $red; 
} 

Alors je l'appellerais comme ça? (Ma meilleure estimation, mais ne semble pas que cela fonctionnerait)

$xFromArray = new xFromArray; 
foreach($array_1 as $key=>$data) { 
    $xFromArray->create_function(set.ucfirst($data)($data)); 
    echo $xFromArray->create_function(get.ucfirst($data)); 
} 
+0

Ça a l'air moche, n'est-ce pas? –

Répondre

7

Vous pouvez utiliser __call() pour invoquer des méthodes dynamiques. Alors:

class Wrapper { 
    private $properties; 

    public function __construct(array $names) { 
    $this->properties = array_combine(array_keys($names), 
     array_fill(0, count($names), null)); 
    } 

    public function __call($name, $args) { 
    if (preg_match('!(get|set)(\w+)!', $name, $match)) { 
     $prop = lcfirst($match[2]); 
     if ($match[1] == 'get') { 
     if (count($args) != 0) { 
      throw new Exception("Method '$name' expected 0 arguments, got " . count($args)); 
     } 
     return $properties[$prop]; 
     } else { 
     if (count($args) != 1) { 
      throw new Exception("Method '$name' expected 1 argument, got " . count($args)); 
     } 
     $properties[$prop] = $args[0]; 
     } 
    } else { 
     throw new Exception("Unknown method $name"); 
    } 
    } 
} 

Personnellement, je n'emprunter la voie d'utiliser des accesseurs en PHP. Utilisez plutôt les méthodes spéciales __get() et __set() et traitez ces propriétés dynamiques comme des propriétés d'objet plutôt que d'ajouter un wrapper de méthode (probablement inutile).

Modifier: pour clarifier, __call() est appelée lorsque vous appelez une méthode dans un objet qui n'existe pas ou est inaccessible. Alors:

$wrapper = new Wrapper($array_1); 
$wrapper->setOne("foo"); 
echo $wrapper->getOne(); // foo 
$wrapper->getAbc(); // exception, property doesn't exist 

__call() est utilisé ici pour déchiffrer le nom de la méthode. Si elle correspond au modèle de get ou set suivi d'un nom de propriété (à partir du tableau initial), alors cela fonctionne comme prévu, sinon il déclenche une exception. Vous pouvez bien sûr changer ce comportement comme vous le souhaitez.

Voir Overloading dans le manuel de PHP pour une explication plus détaillée de ces méthodes "magiques".

+0

Voici comment je l'appelle: $ wrapper = new Wrapper ($ array_1); Comment puis-je appeler les valeurs individuelles du tableau dans le wrapper Set/Get? –

+0

serait-il $ wrapper -> __ call ($ name, 'get'); –

+0

Ce serait comme vous l'avez décrit: pour l'élément 'one' vous appelez '$ wrapper-> setOne ('une certaine valeur');' & pour l'obtenir '$ wrapper-> getOne();' – Wrikken

2

Vous pouvez utiliser __call() (ou __set() & & __get()), mais ils ont une surcharge.

Questions connexes