IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHP 8 ne convertit plus les variables ?


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut PHP 8 ne convertit plus les variables ?
    Bonjour,

    Jusqu'à présent avec PHP 7 je faisais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (($resultat_recherche_nombre[0][0] + 54400) >= $totalcalcule)
    {
     
    }
    Cela fonctionnait toujours. $resultat_recherche_nombre[0][0] est forcément une chaîne de caractères car récupérée dans la base de données. 54400 et $totalcalcule sont des nombres.

    Je savais que PHP convertit les variables dans le même format et qu'on a pas à s'occuper de ça.

    Mais lors du passage sur PHP 8.0, j'ai un message
    Uncaught TypeError: Unsupported operand types: string + int
    J'ai constaté que cette solution fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (((int)$resultat_recherche_nombre[0][0] + 54400) >= $totalcalcule)
    {
     
    }
    C'est nouveau j'imagine, donc à partir de PHP 8 il faut faire attention au type de chaque variable même si toutes les variables commencent toujours par $ ? Ou je n'ai rien compris au réel problème ?

    Donc pour résumé, je ne cherche pas vraiment d'aide pour résoudre l'erreur car j'ai trouvé, mais pour comprendre pourquoi ma façon de faire habituelle ne fonctionne plus.

    Merci d'avance

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Si PHP 8.xx te sort cette erreur fatale, c'est parce que ta variable $resultat_recherche_nombre[0][0] qui selon tes dires est une chaîne, ne commence pas par un nombre. Mais rien de nouveau sous le soleil, dés PHP 7.1, un warning est émis dans cette situtation et la chaîne est évaluée bon an mal an à 0.

    Conclusion, à ce point de ton code, ta variable n'est pas quelque chose qui se rapproche d'un nombre! Alors plutôt que de cacher la poussière sous le tapis en faisant un cast de string vers int, tu devrais chercher pourquoi tu te retrouves dans une telle situation. Car si PHP 8 fait le choix d'arrêter le script dans une telle situation, ce n'est pas seulement pour des questions d'orientation du langage vers un typage plus fort, c'est aussi parce que ce genre de situation révèle une erreur quelque part en amont (autrement dit, cette situation ne devrait pas arriver).

    Donc la question à se poser est: pourquoi $resultat_recherche_nombre[0][0] n'est pas (ou ne commence pas dans le cas d'une chaîne) un nombre?

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonsoir,

    Je suis désolé du retard de ma réponse, j'ai peu de temps pour m'occuper du site en ce moment.
    J'ai constaté qu'effectivement la valeur récupérée dans la base de données n'était pas un nombre car il y avait un espace qui s'est rajouté. Ouf, PHP 8 convertit toujours automatiquement si besoin.
    J'ai constaté que PHP 8 transforme plusieurs choses en erreur qui n'empêchaient pas le code de fonctionner comme désiré sous PHP 7. Bon tant mieux, cela m'a permis de corriger plusieurs choses. Là où c'est plus délicat ce sont les choses ajoutées dans le code que je n'ai pas codé moi même comme par exemple un éditeur WYSIWYG, que d'amusement de comprendre comment tout fonctionne ...

    Je m'excuse de vous avoir dérangé pour rien.

    Bonne nuit

  4. #4
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    C'est sûrement dû à qu'un "string" entre guillemet et différent d'une string sans guillemet. Elles ne sont plus égale en PHP8 !

    Par exemple en PHP8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo match (8.0) {
      '8.0' => "Oh no!",
      8.0 => "This is what I expected",
    };
    //> This is what I expected
    https://www.php.net/releases/8.0/fr.php

    Ou encore :

    En PHP7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Number {
      /** @var int|float */
      private $number;
     
      /**
       * @param float|int $number
       */
      public function __construct($number) {
        $this->number = $number;
      }
    }
     
    new Number('NaN'); // Ok

    En PHP8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Number {
      public function __construct(
        private int|float $number
      ) {}
    }
     
    new Number('NaN'); // TypeError
    C'est beaucoup mieux, plus compréhensible, plus convivial, plus rapide et moins prise de tête et return une error.... à la place de vrai/ok/true qui serait FAUX - il faudrait faire d'autres vérifications is_int || is_float

    PS : En PHP8 on peut déclarer le "Type" DES VARIABLES et cela directement dans les méthodes (function) et bien plus encore

    @encoremoi21258 : Sinon trim($fake_number) à l'insert ou à l'affichage pour supprimer les espaces de début (avant) et et de fin (après) Chose bizarre à faire mais bon... :/




    Salutations,
    Romain

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Merci pour cette explication LAB3W.

    Effectivement, mettre un trim autour d'un nombre qui peut contenir un espace est un peu bizarre et relèverait plutôt du problème de conception du code. Je ne sais pas pourquoi il y avait un espace ni pourquoi ça fonctionnait jusqu'à présent. C'était probablement le résultat d'une très ancienne édition manuelle de la base de données, peut être avec un copier/coller, qui a rajouté un espace.

    Voir int ou float devant une variable en PHP me semble si étrange. Je devrais davantage m'intéresser aux nouveautés de PHP 8.

  6. #6
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut
    Tu as raison. Il assurent les créateurs de PHP. C'est de plus en plus strict, ce qui permet de savoir de mieux en mieux développer, d'apprendre "bien", de bonnes choses, de bonnes valeurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] Page PHP / PDO ne reçoit pas les variables passées par la page précédente
    Par notebleue dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/03/2017, 12h58
  2. [PHP 5.3] PHP en cli : ou définir les variables d'environnement ?
    Par het44 dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2013, 10h00
  3. [PHP-FLASH] Recevoir et organiser les variables php
    Par arnaudrou dans le forum Flash
    Réponses: 6
    Dernier message: 02/08/2006, 12h41
  4. Passer les variables de fichier.php en fichier.php
    Par Furius dans le forum Langage
    Réponses: 4
    Dernier message: 20/11/2005, 23h05
  5. [HTML][PHP] Formulaire impossible de récupérer les variables
    Par Pfeffer dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/11/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo