Page 1 sur 1

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

Posté : 12 juil. 2016, 15:44
par carte-sd
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 ?

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

Posté : 12 juil. 2016, 16:44
par moogli
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 ;)

@+

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

Posté : 12 juil. 2016, 16:45
par @rthur
Bonjour,

Je ne vois pas ton declare(strict_types=1); ?

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

Posté : 12 juil. 2016, 18:17
par carte-sd
@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.

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

Posté : 13 juil. 2016, 00:01
par @rthur
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 ?

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

Posté : 13 juil. 2016, 11:07
par carte-sd
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...

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

Posté : 13 juil. 2016, 12:33
par moogli
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 ;)


@+