2017-08-20 2 views
0

Je viens de déboguer du code PHP 7.1 dans un plugin WP où une fonction renvoyait seulement 0 ou 1 lorsque je m'attendais à d'autres ints. Je me suis rendu compte que j'avais oublié d'enlever un casting (bool) de plus tôt.hinting type PHP: bool et int

Mais cela m'a fait réfléchir, car la fonction avait un type de retour de int. Voici une version simplifiée:

function get_foo(): int { 
    $val = get_option('foo'); // Returns a string that can be parsed as an int 
    return (bool) $val; 
} 

$foo = get_foo(); 

Test the code here.

Il est facile de jeter entre bool et int, bien sûr, mais pourquoi ne pas jeter un TypeError?

Il existe trois scénarios dans lesquels une erreur TypeError peut être levée. ... La seconde est où une valeur renvoyée par une fonction ne correspond pas au type de retour de la fonction déclarée.

+0

poster un code, le comportement actuel et le comportement attendu. –

+0

très difficile à comprendre, poster l'échantillon ou code réel avec le schéma de la table de base de données aussi ... –

+0

@M_Idr ees B.Balamanigandan Désolé, édité. –

Répondre

2

Vous devez ajouter la directive strict_types pour le type hinting fonctionne correctement

Je cite PHP 7 New Features

Pour activer le mode strict, une seule directive annoncez doit être placé en haut du fichier . Cela signifie que la rigueur de la saisie pour les scalaires est configurée par fichier. Cette directive ne concerne que les déclarations de type de paramètres, mais aussi le type de retour d'une fonction (voir retour déclarations de type, les fonctions intégrées de PHP, et les fonctions de extensions chargées.

Avec cela, vous devriez le faire.

<?php 
declare(strict_types=1); 

function get_option_foo() : int { 
    $val = get_option('foo'); // Returns a string that can be parsed as an int 
    return (bool) $val; 
} 

$foo = get_option_foo(); 

Essayez cette fois encore, vous recevrez un Uncaught TypeError Exception

+0

Ah! Comment ai-je manqué ça? Je vous remercie. –

+0

En outre, le fait que [cela ne peut pas être fait globalement] (https://stackoverflow.com/questions/37111470/enabling-strict-types-globally-in-php-7) est déprimant pour cet utilisateur relativement récent de PHP. –

+1

Pour moi, la base par fichier est assez bonne car elle donne assez de flexibilité. Après tout, le typage strict est un supplément pour PHP. Activer STRICT_TYPING globalement sur un serveur casserait beaucoup d'applications PHP existantes qui n'ont pas été codées conformément à la stricte dactylographie .... :) – MiSAKACHi