Aujourd’hui un peu de code permettant d’additionner les valeurs d’une méthode de plusieurs objets. En d’autres termes additionner une collection d’objets suivant une fonction donnée.
L’idée m’est venue suite à une question posée sur le forum PHP France.
Code de la classe
[php]/*** Classe permettant d’additionner les valeurs d’une propriété d’un objet
*/
class AddObj {
/**
* Méthode privé utilisée pour réaliser la somme des objets
* @param unknown_type $property
*/
private static function _getValue($obj, $property) {
return $obj -> $property();
}
/**
* Ajoute les propriétés d’une liste d’objets donnés
* @param $array Le tableau contenant les objets
* @param $property La propriété à utiliser pour effectuer l’addition
*/
public static function add(Array $array, $property) {
return array_sum(array_map(array(__CLASS__, ‘_getValue’), $array, array_fill(0, count($array), $property)));
}
}[/php]
Ainsi, il suffit de passer un tableau d’objets ainsi que la propriété à utiliser pour effectuer l’addition : la classe s’occupe du reste et vous renvoi le total.
La méthode add() s’occupe d’effectuer l’opération pour vous
[php]$total = AddObj :: add($tab, ‘getValue’);[/php]
Dans ce cas, le tableau s’appelle $tab et contient des objets contenant une méthode getValue(). Peu importe leur type, l’important est qu’ils possèdent une méthode getValue().
Code de test complet
[php]<?php// Classe MonObj
class MonObj {
private $value = 0;
public function __construct($value) { $this -> value = $value; }
public function getValue() { return $this -> value; }
}
/**
* Classe permettant d’additionner les valeurs d’une propriété d’un objet
*/
class AddObj {
/**
* Méthode privé utilisée pour réaliser la somme des objets
* @param unknown_type $property
*/
private static function _getValue($obj, $property) {
return $obj -> $property();
}
/**
* Ajoute les propriétés d’une liste d’objets donnés
* @param $array Le tableau contenant les objets
* @param $property La propriété à utiliser pour effectuer l’addition
*/
public static function add(Array $array, $property) {
return array_sum(array_map(array(__CLASS__, ‘_getValue’), $array, array_fill(0, count($array), $property)));
}
}
// Tableau contenant les objets
$tab = array(
new MonObj(4),
new MonObj(7),
new MonObj(1),
new MonObj(2)
);
// Total
echo AddObj :: add($tab, ‘getValue’);[/php]
Evolution du code
Ce code est perfectible car il n’effectue aucun contrôle sur les données passées ou sur la méthode à utiliser. Il est cependant très simple de le sécuriser et de l’améliorer.