Blog de Nicolas Hachet

PHP : additionner une collection d’objets

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.