Bien,
leçon numéro 1, naissance d'un type
Ouvrir un terminal, taper :
ainsi on va démarrer le mode interactif de PHP, c'est dedans que l'on va faire nos exercices (plus rapide).
On va travailler en PHP 5 (mais pas 5.3, ce qui serait plus rapide encore mais bon).
On va tester une fonction qui ne retourne rien implicitement (pas de mot-clé
return), qui ne retourne rien explicitement (avec un mot-clé
return) et on va comparer :
<?php
function f ( ) { }
function g ( ) { return; }
var_dump(f(), g());
NULL
NULL
On peut donc — par analyse avec le langage C — dire que la constante
null de PHP peut-être comprise comme le type
void.
Pour une meilleure lecture du code (et pour être sûr du comportement,
i.e. ne pas avoir de surprise), on aimerait retourner
void à la place de rien ou de
null. En effet, on apprécierait différencier ces deux valeurs. Même si le résultat sera le même, ça peut améliorer la lecture et la compression d'une fonction (ce n'est pas souvent, mais ça peut). Pour ça, on peut construire le « type »
void en PHP, tout simplement en déclarant une constante :
!defined('void') and define('void', null);
Ainsi :
function f ( ) { }
function g ( ) { return; }
function h ( ) { return null; }
function i ( ) { return void; }
Mais bon, ne se voilons pas la face, on ne saura jamais faire la différence entre
null et
void à l'exécution. Ce n'est uniquement là pour améliorer la lecture du code.
Suite,
leçon numéro 2, à la découverte d'un transtypage
Petit rappel sur les types, PHP a comme type :
boolean,
integer,
float point numbers,
string,
array,
object,
resources et
null (remplaçons
null par
void et on comprend immédiatement pourquoi c'est plus logique d'avoir un type
void … non ? Mais si,
void est un type alors que
null est une valeur nulle !).
Quand on effectue un transtypage, on demande à PHP de changer le type d'une donnée. Dans l'ordre alphabétique, voici les transtypages possibles :
- array → array ;
- bool ou boolean → boolean ;
- double, real ou float → double ;
- int ou integer → integer ;
- object → object ;
- string → string.
On notera que PHP ne fait pas la différence entre les nombres doubles, les nombres réels et les nombres flottants. Quand on parle de grands nombres ou de nombres à virgule, la terminologie PHP parle de
floatting point numbers.
On notera également qu'on ne peut pas transtyper une donnée vers une ressource. Les ressources sont bien trop compliquées pour ça, on ne détaillera pas ici le pourquoi du comment, on demande au lecteur (ou lectrice) de l'admettre.
Mais il manque un transtypage ? Oui ! Il manque le transtypage
unset →
unset. Le membre droit de la règle de transtypage n'est pas très parlant …
unset … oui et alors ? Ça veut dire que les valeurs seront détruites, donc mise à la valeur nulle (là encore, on parle de valeur nulle et pas de type nul).
Ainsi :
$a = new StdClass();
var_dump((unset) $a);
NULL
En quoi est-il pratique ?
Il faut savoir que PHP a des fonctions qui ne sont pas réellement des fonctions, mais plutôt des « instructions » du langage, on parle d'expressions du langage. On trouve : array(), echo(), empty(), eval(), exit(), isset(), list(), print() et … unset().
On comprendra mieux à travers un exemple :
function f ( $arg ) { var_dump($arg); }
$a = new StdClass();
f($a);
object(stdClass)#1 (0) {
}
f((unset) $a);
NULL
f(unset($a));
Parse error: syntax error, unexpected T_UNSET, expecting ')' in /Users/hywan/- on line 11
Quand on appelle
f($a) simplement, pas de problème, le comportement est celui attendu.
Quand on appelle
f( (unset) $a), on transtype vers
null et l'affichage le confirme.
Quand on appelle
f( unset ( $a )), on a une erreur. Observons pourquoi.
Le transtypage
unset force la valeur à
null, alors que d'utiliser la fonction
unset va détruire la valeur, elle n'existera plus en mémoire. Si on fait
unset($a), alors
$a ne sera plus accessible. Le comportement est donc différent.
Pour éviter les effets de bords, la fonction
unset ne peut pas être utiliser en tant qu'argument ou ce genre de chose, d'où le
parse error.
La fonction
unset ne peut être appelée dans des instructions imbriquées. Elle doit nécessairement être seule dans une instruction. Donc un début d'instruction,
unset, ses paramètres, et un point-virgule pour signaler la fin d'instruction. C'est tout.
Voilà, c'était des petites réflexions pour mieux comprendre PHP.
Il faut également comprendre qu'il n'y a aucune bidouille. Ce comportement est très bien décrit et est très correct

.