Mes impressions sur le web, les standards et autres…


PHP5, getter et empty()

Je viens de constater une chose étrange avec PHP5. Si la valeur d’une propriété d’un objet est récupérée par le biais de la méthode magique __get(), cette propriété est toujours considérée comme vide lorsqu’on la teste avec empty() :


class Test {
    private $_foo = 'bar';
    
    public function __get($name)
    {
        if( $name == 'foo' ) {
            return $this->_foo;
        }
    }
}

$test = new Test();
echo $test->foo;// affiche bien 'bar'
var_dump(empty($test->foo));// affiche bool(true) ?!

Il y a probablement une logique interne derrière ce comportement surprenant, mais basiquement, on s’attend simplement à ce que empty() nous dise si la variable ou l’attribut testé est vide ou pas, point barre. Cela fait partie de ces comportements vicieux qu’a parfois PHP.

Dans la même veine, on a le résultat d’une comparaison non stricte entre un entier et une chaîne (par exemple issue de $_POST) :


$var1 = 1;
$var2 = '1textQuelconque';

var_dump($var1 == $var2);

…affichera 'bool(true)'. Et oui… C’est déjà plus logique, si l’on veut, mais c’est tout aussi vicieux. Attention donc, quand vous contrôlez les données provenant d’un formulaire. Rappelez-vous que tout ce que vous recevez dans $_GET, $_POST et les autres ont le type 'string' (ou 'array', si vous passez des tableaux), donc faites vos comparaisons exclusivement entre valeur de type 'string', ou bien utilisez intval() et ses amis quand vous attendez des données précises.