CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[PHP] Comparer le type d'une variable à celui d'un paramètre

BrouETH
BrouETH
Niveau 8
30 septembre 2017 à 17:46:20

Bonjour à tous !

Avant tout, je tiens à préciser que le code ci-dessous est seulement à titre d'illustration.
Il ne correspond aucunement à celui de mon projet qui n'aurait pas été approprié à l'exposition de mon problème.

Je souhaite comparer le type d'une variable avec le type d'un paramètre d'une fonction.
Par exemple, si j'ai:

$Valeur = 22;
$Fonction = function( int $Parametre ) { ... }

Je veux déterminer si le type de $Valeur correspond au type requis pour $Parametre (int).

-----------------

Voici ce que j'utilise pour récupérer le type de $Valeur:

$TypeVal = gettype($Valeur);

Et pour obtenir le type requis pour $Parametre:

// Récupère les informations de la fonction
$InfosAppel = new \ReflectionFunction($Fonction);

// Déduction des paramètres demandés
$ParametresAppel = $InfosAppel->getParameters();

// Obtention du type du premier paramètre
$TypeParam = (string)$ParametresAppel[0]->getType()

----------------

Jusque là, tout va bien. Maintenant venons-en au problème :noel:
Si je lance mon code pour les valeurs données tout en haut, voilà ce que j'obtiens:

$TypeVal = "integer";
$TypeParam = "int";

Vous l'aurez bien compris, il m'est impossible d'avoir une comparaison fiable avec ces deux retours.

Comment se fait-il que ces deux fonctions retournent bien le même type mais avec un format différent ?
Est-il possible de passer de int à integer ou l'inverse en utilisant les fonctions standards ?

Merci d'avance !

Message édité le 30 septembre 2017 à 17:48:46 par BrouETH
BrouETH
BrouETH
Niveau 8
30 septembre 2017 à 18:16:31

Bon, au delà de la solution qui consiste à vérifier la présence de la valeur de $TypeParam dans $TypeVal (qui aurait pu fonctionner mais peu fiable et un peu sale), j'ai tenté plusieurs choses avec:

// true si le type de $Valeur correspond au type attendu en paramètre de $Fonction
$TypeCorrespondant = settype( $Valeur, $TypeParam );

Visiblement settype reconnait à la fois int et integer en second paramètre et retourne bien true lorsqu'on a un entier.
Je vais approfondir mes tests car la fiabilité de cette vérification est vraiment importante dans le cadre de mon projet (une question de sécurité)

Message édité le 30 septembre 2017 à 18:17:45 par BrouETH
Azmurael
Azmurael
Niveau 10
30 septembre 2017 à 18:19:11

gettype() n'est pas recommandé pour vérifier des types. Essaie plutôt d'utiliser les fonctions is_...

BrouETH
BrouETH
Niveau 8
30 septembre 2017 à 18:24:15

Le 30 septembre 2017 à 18:19:11 Azmurael a écrit :
gettype() n'est pas recommandé pour vérifier des types. Essaie plutôt d'utiliser les fonctions is_...

C'est noté, tu fais bien de le dire car je l'utilise de nombreuses fois ... Merci ! :)
Par contre dans ce cas là, j'ai oublié de préciser que $Valeur peut-être n'importe quoi (entrée utilisateur), donc impossible d'utiliser les is_*

Pour le moment je reste avec settype, $Valeur étant une chaîne ça effectue la conversion en même temps

Message édité le 30 septembre 2017 à 18:25:14 par BrouETH
BrouETH
BrouETH
Niveau 8
30 septembre 2017 à 18:47:42

Après pas mal de tests, settype me convient parfaitement.
Voici à quoi ressemble ma condition:

// $Valeur est toujours une chaine. On cherche à le convertir vers le type le plus approprié à celui du paramètre de la fonction. Si ce n'est pas possible, on retourne false.
$ValeurInit = $Valeur;

$TypeOK = setType($Valeur, $TypeParam);

// Comparaison des types.
if (!$TypeOK || (empty($Valeur) && strval($Valeur) !== $ValeurInit) )
      // Fonction rejetée
      return false;

Sujet résolu ! :fete:

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment