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 :

Transformer des list = each en foreach pour PHP 8


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Transformer des list = each en foreach pour PHP 8
    Bonjour,

    Je suis un développeur PHP du dimanche (comprendre, je fais juste des bidouilles mineures) et j'essaie de convertir un vieux logiciel PHP5 pour PHP8.

    Notamment il faut remplacer toutes les instructions each.

    La majorité du temps, j'utilise ce modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (list($key, $value) = @each($_POST['form']))
    est remplacé par cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ($_POST['form'] as $key => $value)
    J'en ai corrigé des dizaines dans le style.

    -

    Mais j'ai un doute avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (list($key) = each($str)) { 
        $str[$key] = $this->xss_clean($str[$key]); 
    }
    Est-ce que ce remplacement va fonctionner ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($str as $key => $value) { 
        $str[$key] = $this->xss_clean($str[$key]); 
    }
    Il y a le même type de code plus loin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (list($key) = each($data)) {
        if ( is_array($data[$key])) continue;
        if ($data[$key] != 'TRUE' && $data[$key] != 'FALSE' && ($key != $data[$key] OR $embedded_tags !== TRUE))
    Que je remplacerais par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($data as $key => $value) { 
        if ( is_array($data[$key])) continue;
        if ($data[$key] != 'TRUE' && $data[$key] != 'FALSE' && ($key != $data[$key] OR $embedded_tags !== TRUE))
    Vous me direz, il suffit de tester, mais ces bouts de code se trouvent dans des méandres de librairies, je ne sais pas à quel moment ils sont appelés...

    Merci d'avance à celui ou ceux qui me confirmeront ou non ces changements, sans doute triviaux pour un vrai développeur PHP.

  2. #2
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 064
    Points
    3 064
    Par défaut
    Bonjour

    Comme tu es étudiant alors je me permets de te répondre avec quelques outils qui demandent un peu de temps à prendre en main mais, misère de misère, comme c'est GRANDIOSE de travailler de la sorte.

    Regarde p.ex. cette petite vidéo : https://spatie.be/videos/front-line-...8-using-rector

    Cela fait exactement ce que tu demandes; convertir un code legacy et le porter sur PHP 8.

    L'exemple montre un seul fichier mais que ce soit un ou des dizaines de milliers, cela fonctionnera. Tout en automatique et sans aucune erreur possible !

    La magie se nomme rector.

    Dans l'exemple, il est fait mention de Docker; autre outil absolument fabuleux qui permet, simplifions, d'installer un environnement de travail sur ta machine; cela sous la forme d'un unique fichier nommé "container". Tu peux donc installer Rector sans te prendre la tête d'installer Rector , juste de l'utiliser au travers d'un container ayant été créé et configuré par l'équipe derrière l'outil.

    Simple, rapide et méchamment efficace. Reste qu'il faut investir du temps à apprendre Docker et rector mais, si tu es étudiant en informatique, c'est VRAIMENT ce qu'il faut faire. Ces outils te seront fortement utiles dans le futur.

    Bonne journée.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci cavo789 d'avoir pris le temps de répondre.

    J'ai mis étudiant à la va vite, mes études d'informatiques datent d'il y a 25 ans et ça fait longtemps que je ne suis plus professionnellement dans le milieu.

    Je vais regarder l'outil que tu suggères, je ne connaissais pas et je me complique la vie pour rien !

  4. #4
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 793
    Points : 3 064
    Points
    3 064
    Par défaut
    Citation Envoyé par DeveloppeurDimanche Voir le message
    J'ai mis étudiant à la va vite...
    Dans notre milieu, même si on n'est plus actif à 100% dans la branche, on est toujours étudiant C'est le propre de l'informaticien; sans cesse renouveler et acquérir de nouvelles compétences.

    Bon dev et remise à l'étrier.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    while/list/each c'est plutôt du PHP3, un des grands apport de PHP4 ayant été foreach


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (list($key) = each($str)) { 
        $str[$key] = $this->xss_clean($str[$key]); 
    }
    Le but est de parcourir une chaîne et d'appliquer xss_clean() sur chaque caractère ? Si oui ça devait déjà être bugué sur les chaînes aux caractères multi-octets comme UTF-8.

    Tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $new_str = '';
    $n = mb_strlen($str);
    for ($i = 0; $i < $n; $i++) {
        $new_str .= $this->xss_clean(mb_substr($str, $i, 1)); // Reste à voir si xss_clean() prend en charge UTF-8
    }
    $str = $new_str;


    Pour celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (list($key) = each($data)) {
        if ( is_array($data[$key])) continue;
        if ($data[$key] != 'TRUE' && $data[$key] != 'FALSE' && ($key != $data[$key] OR $embedded_tags !== TRUE))
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            continue;
        }
        if ($value != 'TRUE' && $value != 'FALSE' && ($key != $value || $embedded_tags !== true)) {
            ...
        }
    }
    Bon courage

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Le but est de parcourir une chaîne et d'appliquer xss_clean() sur chaque caractère ? Si oui ça devait déjà être bugué sur les chaînes aux caractères multi-octets comme UTF-8.
    Merci Seb !

    C'est effectivement du code qui date de 2005, et la BDD n'est pas en UTF-8.

    C'est tout à fait anachronique, mais ça fonctionne bien, sauf quand il y a des migrations de PHP à gérer !

    Bonne journée à toi.

Discussions similaires

  1. Traitement des listes avec GNU Prolog pour Java
    Par JeuneJavaiste dans le forum Prolog
    Réponses: 1
    Dernier message: 07/09/2011, 13h27
  2. [MySQL] Connexion PHP et MySQL pour des listes
    Par TSniper dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/04/2009, 00h43
  3. Réponses: 1
    Dernier message: 08/01/2007, 17h21
  4. [JSTL] boucle forEach pour deux liste en même temps
    Par ruud002 dans le forum Taglibs
    Réponses: 1
    Dernier message: 28/09/2006, 15h54
  5. Réponses: 8
    Dernier message: 28/11/2005, 14h41

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