Blog // Exirel.me

Multi-Db avec Zend

Dans Technique par Florian Strzelecki - 18:20 - 07.10.2011

Tags : Framework, Web, Documentation, Programmation, PHP, SQL, loldev, Zend Framework

Depuis que je travaille avec le Zend Framework (et ce n'est définitivement pas par passion ni envie), je ne passe pas une semaine sans avoir besoin d'aller voir dans le code source du framework pour comprendre ce qu'il fait, pourquoi, comment, et en quel honneur.

Et généralement, je me marre - enfin pas vraiment, mais faites comme si.

Cette semaine pour le #loldev du vendredi, c'est la documentation qui m'a donné l'info qui me manquait pour résoudre un problème qui n'est pas trivial à l'origine, mais qui devrait l'être avec un framework web digne de ce nom : comment gérer une application qui doit se connecter à différentes bases de données ?

En voilà une question intéressante... voici ma réponse.

Pages and pages of source code.

Image : Pages and pages of source code. - Neil Crosby (http://www.flickr.com/photos/thevoicewithin/) - Creative-Common By-NC-SA

Lire la suite - 1 commentaire

Dédoublonner un tableau de tableau en php

Dans Technique par Florian Strzelecki - 14:01 - 30.09.2011

Tags : Documentation, Programmation, PHP, Optimisation, loldev

Halala... le array_unique est définitivement une fonction trompeuse de php. Pourquoi ? Parce que son mode de dédoublonnage par défaut est SORT_STRING, et pas SORT_REGULAR. D'ailleurs, c'est d'autant plus un problème que ce fut le cas en PHP 5.2.9, puis retour arrière en PHP 5.2.10.

Note : documentation php de array_unique.

Le #loldev du vendredi nous vient donc de cette petite fonction. En voici l'exemple :

$res = array(
        array('id' => 2),
        array('id' => 3907),
        array('id' => 7814),
        array('id' => 2),
    );
$unique = array_unique($res);
var_dump($unique);

// Résultat :
// array(0 => array('id' => 2));

Ce qui est un problème, puisque le but, c'est seulement de virer la deuxième ligne, comme il a été fait dans l'exemple suivant :

$id = array();
foreach ($res as $idRes) {
    $id[] = $idRes['id'];
}
$id = array_values(array_unique($id));

Donc, oui, cela fonctionne et on obtient bien un tableau dédoublonné par la valeur de la clé 'id' de chaque tableau. Heureusement, il y a mieux aujourd'hui.

Ce code provient d'une application pré-5.2.9, où le flag "SORT..." n'existait tout simplement pas. Ce n'est donc pas la faute du pauvre développeur qui a dû trouver à l'époque une solution qui fonctionne ! Je n'aurais pas aimer être à sa place.

Car aujourd'hui, il suffit d'écrire ceci :

$res = array_unique($res, SORT_REGULAR);

Pour dédoublonner le tableau. Simple, efficace. Mais il aura fallu attendre PHP 5.2.9 pour pouvoir le faire !

Remarque : suite à des remarques, voici le pourquoi du comment SORT_STRING pose problème :

Par défaut array_unique transforme en string le contenu de chaque élément du tableau, donc (string) array(...) ça donne "Array". Donc il trouve que le tableau de tableau, c'est un array de 'Array', 'Array', 'Array', ... qui sont donc des éléments identiques, et ne retourne que le premier élément.

Logique, imparable, mais particulièrement pénible.

Lien permanent - 4 commentaires

Ugly code

Dans Technique par Florian Strzelecki - 23:56 - 27.09.2011

Tags : Framework, Programmation, Bonne pratique, Chaton, Optimisation, Problème, loldev

Il est parfois difficile de dire d'un code qu'il est bon ou mauvais, qu'il est moche ou élégant. Parfois, les deux se confondent dans un doute profond sur la nature d'une idée, et sur son implémentation.

Beautiful is better than ugly.

Heureusement, parfois, il y a du code php/java/python/javascript/ruby/perl/autre bien sale et c'est très facile à repérer.

Notez l'effort pour ne pas troller toujours sur le même langage.

Lire la suite - 2 commentaires

(bool) $flag

Dans Technique par Florian Strzelecki - 11:00 - 08.08.2011

Tags : Framework, Web, Programmation, Bonne pratique, PHP, loldev

Je suis toujours autant amusé par ce que je peux trouver dans le code-source du Zend Framework. Oh, rien de grave, cela fonctionne très bien de cette façon là :

public function setNoRender($flag = true)
{
    $this->_noRender = ($flag) ? true : false;
    return $this;
}

Il s'agit d'une méthode de la classe Zend_Controller_Action_Helper_ViewRenderer, qui effectue un traitement fort simple et basique, mais d'une façon que je trouve "inutile".

Je veux dire... si j'analyse ce bout de code d'un coup d'oeil, je peux voir qu'un cast implicite en booléen est effectué, pour ensuite... affecter cette même valeur (mais écrit "explicitement"). En gros, ce bout de code est strictement équivalent au suivant :

$this->_noRender = (bool) $flag;

Pourquoi faire plus compliqué ? Pourquoi s'embêter à écrire explicitement "true" et "false" ?

Oui, c'est du pinaillage. Mais j'aime bien pinailler sur ce genre de choses.

Lien permanent - 5 commentaires

Algorithme en if mineur

Dans Technique par Florian Strzelecki - 09:47 - 18.07.2011

Tags : Programmation, Bonne pratique, PHP, loldev

Un petit truc auquel je viens de penser, en regardant du code trouvé sur Internet dans l'une de mes recherches :

$ok = $database->query($sql);

if ($ok !== false) {
    $ok = $this->doSomething();
}
if ($ok) {
    $ok = $this->doItAgain();
}
return $ok;

Ce petit bout de code, nous allons (je vais) l'optimiser. Comment ? En réduisant les instructions inutiles, et en le rendant un brin plus "lisible" - en tout cas, moi, les if à la chaîne, ça me file des boutons.

if (false !== $database->query($sql)) {
    return $this->doSomething() && $this->doItAgain();
} else {
    // Ne faudrait-il pas lever une exception ?
    // Ou au moins traiter l'erreur ?
}
return false;

Le principe est simple : lorsqu'une expression booléenne est forcément fausse ou vrai, elle n'est pas évaluée jusqu'au bout. Dans notre cas, si $this->doSomething() retourne false, alors $this->doItAgain() ne sera jamais évalué.

Simple, efficace. J'aurais pu éviter le premier if d'ailleurs, mais je me dis que traiter l'erreur c'est un peu mieux que simplement retourner false et laisser le reste s'en charger.

Lien permanent - Commentez l'article

RSS