Type void, constante null et transtypage unset.

ViPHP
ViPHP | 4674 Messages

09 janv. 2009, 17:00

Hey :),

Il est parfois utile d'avoir un type void. Malheureusement, il n'existe pas dans PHP.

Heureusement (;-)), on peut l'obtenir en utilisant la constante nulle : null. On peut donc définir une constante de cette façon :
!defined('void') and define('void', null);
Quand on a des appels imbriqués de méthodes ou de fonctions, il est bon de pouvoir transtyper les valeurs de retour vers notre nouveau type void. Comment transtyper vers null ? Tout simplement avec le transtypage unset (assez méconnu). On peut alors écrire :
(unset) $sumthin;
Et pour le fun, sous vos yeux zébahis :
!defined('void') and define('void', (unset) null);
 De cette façon, on est sûr d'avoir une valeur nulle. Ça fait un peu alien, mais c'est pratique d'utiliser le type void en le différenciant de la constante null :) (au niveau du code, pas de l'interprétation).

Wala, c'était juste un petit mot sur un type, une constante et un transtypage méconnu :).


Édition : voir les leçons un peu plus bas pour mieux comprendre.
Modifié en dernier par Hywan le 11 janv. 2009, 12:28, modifié 1 fois.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 2287 Messages

09 janv. 2009, 18:40

Image

Quelle est la différence (pratique et/ou théorique) entre le transtypage unset, que je ne connaissais pas, et un simple null ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

ViPHP
ViPHP | 4674 Messages

09 janv. 2009, 18:44

A priori aucun … pour l'instant.
Le but était surtout de faire connaître deux ou trois petites choses :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4039 Messages

10 janv. 2009, 00:02

Je crois qu'hywan s'oriente de plus en plus vers les astronautes dont parle Joel.

C'est beau, intéressant (ça m'a toujours manqué, un
void
dans php. Déjà que je mettais des foo partout), mais, dans la pratique, inutile. Enfin, jusqu'à la preuve du contraire.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 4674 Messages

10 janv. 2009, 01:09

Les astronautes :? ?
Mais sinon, oui, dans la pratique, ça peut paraître peu intéressant, sauf des cas très particuliers. Mais je le répète, c'est surtout un prétexte pour faire découvrir ce transtypage (qui lui est utile en revanche !).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 185 Messages

11 janv. 2009, 00:24


lux
Eléphant du PHP | 372 Messages

11 janv. 2009, 02:00

Pour ma culture, je peux avoir un peu plus de détails ? J'ai rien pigé au code posté :P


Le seul truc que m'évoque void, c'est dans un sombre cours de C++, une histoire de fonction qui ne renvoie rien ... mais j'ai l'impression que ça ne parle pas de ça ici. :P

ViPHP
ViPHP | 4674 Messages

11 janv. 2009, 12:26

Bien, leçon numéro 1, naissance d'un type

Ouvrir un terminal, taper :

Code : Tout sélectionner

$ php -a
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 :
  • arrayarray ;
  • bool ou booleanboolean ;
  • double, real ou floatdouble ;
  • int ou integerinteger ;
  • objectobject ;
  • stringstring.
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 unsetunset. 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 :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 1996 Messages

11 janv. 2009, 12:37

je veux pas paraître enfin si... c'est quoi "void" ? (traduction demandé au grand hywan)
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

ViPHP
ViPHP | 4674 Messages

11 janv. 2009, 12:52

Ce mot est né dans le langage C si je ne m'abuse. Il veut dire rien en gros. Si tu as une fonction qui ne retourne rien, tu vas écrire

Code : Tout sélectionner

void f ( ) { }
Si ta fonction ne prend aucun argument, tu peux aussi écrire :

Code : Tout sélectionner

void f ( void ) { }
Ça indique au compilateur qu'il ne doit rien à attendre car rien va arriver.

En C, tu peux aussi l'utiliser pour des pointeurs multi-types mais bon, c'est particulier au C (a fortiori C++, Objective-C, C# etc. j'imagine). Comme PHP gère les pointeurs tout seul (attention à ne pas confondre avec les références), on n'a pas à se soucier de cet aspect de void.

On se contentera de retenir que void signifie rien :).

Et tu ne parais bête ou débile hein, c'est normal de demander :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

lux
Eléphant du PHP | 372 Messages

11 janv. 2009, 13:01

Je confirme qu'en C++ on peut faire des fonctions déclarées en type void. :wink:

Eléphant du PHP | 209 Messages

11 janv. 2009, 20:36

Du coup, une question me vient à l'esprit :
Peut-on déclarer, par une méthode similaire, ses variables de la façon suivante : int $i; ?
Comme en C, java...

ViPHP
ViPHP | 5924 Messages

11 janv. 2009, 20:59

En C++ ??
Parce que bon, le C++ c'est du C amélioré, euh, non, …, pourrifié, donc ce qui est vrai en C est (généralement) vrai en C++, à fortiori pour les syntaxes de base…

lux
Eléphant du PHP | 372 Messages

11 janv. 2009, 21:01

Je crois qu'il veut parler du php.

Eléphant du PHP | 209 Messages

11 janv. 2009, 21:03

Je crois aussi (cf le $ devant le i) ;)