2017-09-26 2 views
3

Im un peu perplexe avec un problème de type Tip Hint scalaire (que PHP7 devrait être capable de gérer). Fondamentalement, je crée une méthode avec l'indicateur de type bool pour autoriser uniquement les booléens à passer. Cependant, il échoue et laisse passer d'autres types de chaînes. Je crois que dans le passé cela a fonctionné pour moi. Jetez un oeil à l'extrait à titre d'exemple. La première vidage donne false (ce qui est logique puisque 'test' est une chaîne), la seconde vidage donne true ce qui n'a aucun sens pour moi. J'espérais qu'une erreur PHP se déclencherait puisque le type n'est pas un booléen. Des pensées?PHP 7 Bool Type Conseil ne fonctionne pas

<?php 
class Test{ 
    function something(bool $test){ 
     var_dump($test); // "Second dump" 
    } 
} 

$value = 'test'; 
var_dump(is_bool($value)); // "First dump" 
$test = new Test; 
$test->something($value); 

Résultats:

bool(false) 
bool(true) 
+0

En PHP 5.6 ce produit une erreur: https://3v4l.org/ Uo7j0 – nickb

+0

Avez-vous activé le typage strict? –

+0

@JulienLachal Je n'ai pas. Je ne sais pas où l'activer. Ill Google cela. Vous tiendrons au courant. – CodeGodie

Répondre

1

Le problème est que PHP a la conversion automatique pour les primitives. Ils n'ont pas changé cela pendant longtemps, probablement pour des raisons philosophiques. Ce pourquoi précédemment hinting type primitif a été interdit en PHP: https://bugs.php.net/bug.php?id=29508

Comme PHP a des conversions automatiques vous devriez faire ceci afin d'être sûr:

class Test{ 
    function something($test){ 
     if(!is_bool($test)) { 
      throw new InvalidArgumentException("Boolean expected."); 
     } 
    } 
} 

Edit: Lire l'article suivant sur le type hinting scalaire en PHP 7 https://www.phpclasses.org/blog/post/269-PHP-7-Scalar-Type-Hinting-Finally-Approved.html

en PHP 7, il est enfin possible de faire un code contenant le travail primitif de vérification de type en ajoutant

declare(strict_types=1); 

au début du fichier.

+1

en faire une InvalidArgumentException – delboy1978uk

1

La fonction magique que vous recherchez est celui-ci. Mettez-le sur la première ligne au-dessus de votre classe!

declare(strict_types=1) ; 

Maintenant, votre code ressemblera klike ceci:

<?php 
declare(strict_types=1) ; 

class Test{ 
    function something(bool $test){ 
     var_dump($test); // "Second dump" 
    } 
} 

$value = 'test'; 
var_dump(is_bool($value)); // "First dump" 
$test = new Test; 
$test->something($value); 

Maintenant, il va lancer une erreur! http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration.strict

voir travailler ici: https://3v4l.org/eLS1T

Un dernier point, vous avez besoin de mettre cela sur une base par fichier