mercredi 11 février 2009
Dans un projet PHP, la classe Zend_Measure de Zend Framework peut être pratique pour manipuler des unités de mesures. Dans mon cas, j'utilisais des fonctions personnelles pour, par exemple, faire afficher la taille des fichiers en format textuel (souvent appelé "human readable"). L'avantage d'utiliser celle fournie avec le framework est qu'elle permet aussi de faire des additions entre unités de même type, comparer les valeurs, les convertir et de nommer textuellement l'unité de mesure associée au type utilisé.
Comme un exemple vaut mille mots...
// inclure la classe de localisationSi vous ne connaissez pas la locale à utiliser, vous pourrez obtenir la liste complète en exécutant les deux lignes suivantes :
require_once('Zend/Locale.php');
// inclure le type de mesure à utiliser
require_once('Zend/Measure/Binary.php');
// initialiser la locale à utiliser
// ici, français, canadien
$locale = new Zend_Locale('fr_CA');
$localelist = Zend_Locale::getLocaleList();En utilisant filesize(), j'obtiendrai la taille du fichier en bytes que je pourrai convertir en différentes unités (Kb, Mb, Gb).
print_r($localelist);
// obtenir la taille d'un fichierUne petite chose à porter attention est la notation SI (System International) qui utilise une base 10 plutôt que binaire. Ainsi, 103 donne une unité "kilo" de 1000, tandis qu'en binaire, elle serait en de 1024 (210). Selon ce mode de calcul, ça explique pourquoi ma clé USB de 4 Go peut contenir en réalité approximativement 3.7 Go (idem pour certains disques durs, DVD, etc).
$file_path = 'files/mp3/Antoine Dufour/Development/01-Development.mp3';
$size_in_bytes = filesize($file_path); // 5351552
$measure = new Zend_Measure_Binary($size_in_bytes, Zend_Measure_Binary::BYTE, $locale);
// Convertir en une autre unité à l'aide d'une constante de classe.
// La précision par défaut est de 2 chiffres après la virgule
// 5.10 MB
echo $measure->convertTo(Zend_Measure_Binary::MEGABYTE);
// sinon, on peut remplacer la constante de classe par le type textuel
// 5226.13 kB
echo $measure->convertTo('KILOBYTE');
// 5.10 MB
echo $measure->convertTo('MEGABYTE');
// indiquer une précision de 4
// 0.0050 GB
echo $measure->convertTo('GIGABYTE', 4);
// convertir 4 Go SI en l'équivalent binaireMalheureusement, malgré l'utilisation de la localisation, la classe ne semble pas encore être en mesure de traduire les unités, qui sont pour le moment restreintes aux abréviations (version 1.7.4 du ZF). J'aurais aimé pouvoir franciser les termes : Kb => Ko, Mb => Mo, Gb => Go, mais pour l'instant, c'est un bon début.
$measure = new Zend_Measure_Binary(4, 'GIGABYTE_SI', $locale);
// 3.73 GB
echo $measure->convertTo('GIGABYTE');
Dans mon exemple, je fais référence à une pièce musicale d'Antoine Dufour, un guitariste québécois exceptionnel qui vaut la peine de découvrir. J'ai eu la chance de le voir performer dans une salle très intime à St-Jean-de-Matha il y a quelques années (même que parmi les ~40 spectateurs présents, j'ai cru reconnaître Yves Lambert, anciennement de la Bottine Souriante). Avec trois albums à son actif, il partage aussi la vedette sur DVD avec Andy McKee, au autre guitariste talentueux.