php 7, préciser le type d'une variable dans la fonction force le type ?

Eléphant du PHP | 65 Messages

12 juil. 2016, 15:44

Bonjour à tous,

Code : Tout sélectionner

function addition(int $nombre1, int $nombre2):int { if (!is_int($nombre1) || !is_int($nombre2)): throw new TypeError('$nombre1 et $nombre2 doivent être de type int'); endif; return $nombre1 + $nombre2; } try { echo addition(2, 5) . '<br />'; echo addition(3, '9') . '<br />'; } catch (TypeError $e) { echo 'notice: ' . $e->getMessage(); }
Ce code ne renverra aucune erreur, PHP a converti la string en int automatiquement; le preuve, il vous suffit de retirer les types pour que l'erreur soit jetée. Il me semblait avoir lu que préciser le type d'une variable n'était qu'une déclaration et si vous ajoutez le strict_types vous aurez bien une notice.
C'est déconcertant, est-ce un bug ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

12 juil. 2016, 16:44

salut,

le cas que tu décris l'est aussi dans les exemples de la RFC https://wiki.php.net/rfc/scalar_type_hints_v5#example

je ne suis pas surpris qu'il y ait un autoboxing vu que c'est déjà le cas en php à la base.
par conter si tu met "a" à la place de "9"
7
notice: Argument 2 passed to addition() must be of the type integer, string given, called in D:\dev\wsphp\test\ldn.php on line 18
le problème c'est si tu met '9a' ça donne
7
( ! ) Notice: A non well formed numeric value encountered in D:\dev\wsphp\test\ldn.php on line 4
12
la php déconne un peu ;)

@+
Il en faut peu pour être heureux ......

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

12 juil. 2016, 16:45

Bonjour,

Je ne vois pas ton declare(strict_types=1); ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 65 Messages

12 juil. 2016, 18:17

@moogli
Je trouve que PHP est vraiment trop permissif #-o

@rthur
J'ai fait exprès de ne pas le mettre car si je déclare le strict_types mon erreur n'est pas jetée, PHP envoie un TypeError avant même de rentrer dans la fonction.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

13 juil. 2016, 00:01

PHP par défaut fait du transtypage pour les variables, sauf si tu fais un declare(strict_types=1);
Donc comme tu ne le fais pas, tu n'as pas de typage fort.

Du coup, je ne comprends pas ton problème.
Tu as quoi comme résultat et tu attendrais quoi exactement ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 65 Messages

13 juil. 2016, 11:07

PHP par défaut fait du transtypage pour les variables, sauf si tu fais un declare(strict_types=1);
Justement, je l'ignorais; je ne pensais pas que PHP allait jusqu'à changer automatiquement le type d'une variable. Je pensais qu'il acceptait la string et faisait comme si c'était un int. Ça pousse vraiment à produire du code sale, le strict_types devrait être activé par défaut...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 juil. 2016, 12:33

PHP par défaut fait du transtypage pour les variables, sauf si tu fais un declare(strict_types=1);
Justement, je l'ignorais; je ne pensais pas que PHP allait jusqu'à changer automatiquement le type d'une variable. Je pensais qu'il acceptait la string et faisait comme si c'était un int. Ça pousse vraiment à produire du code sale, le strict_types devrait être activé par défaut...

ou pas, php n'as jamais été un langage fortement typé.
C'est pas parfois bien cela t'éviter du transtypage de cochon quand tu valides un formulaire (qui envoi que du string au final, comment il ferais la différence entre un int et un long ou autre).

Ce n'est pas le seul dans le cas (Js ou on golang le font aussi pour ne citer qu'eux).

Dernière chose, comme tu le sais surement il n'est pas possible de typer une variable. a partir de la, même avec l'assurance du type correct tu peux faire n'importe quoi ensuite ;)

bref, soit on utilise la fonctionnalité de php avec un type strict et on catch, soit on vérifie ce que l'on utilise ;)


@+
Il en faut peu pour être heureux ......