PHP : additionner une collection d’objets

29 Août 2011 0 No tags

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.