384 votes

Quand dois-je utiliser la constante PHP "PHP_EOL" ?

Quand est-ce que c'est une bonne idée d'utiliser PHP_EOL ?

Je vois parfois cela dans les échantillons de code de PHP. Est-ce que cela permet de gérer les problèmes de fin de ligne DOS/Mac/Unix ?

1 votes

Je pense qu'il y a beaucoup de conseils trompeurs dans les réponses votées sur cette page. Si vous exécutez un script sur deux plates-formes différentes, puis que vous comparez la sortie ou les données générées (fichiers journaux, page html, enregistrements de la base de données, etc. Dans la plupart des cas, ce n'est pas ce que vous voulez.

384voto

Adam Bellaire Points 42797

Oui, PHP_EOL est ostensiblement utilisé pour trouver le caractère de nouvelle ligne d'une manière compatible avec toutes les plates-formes, donc il gère les problèmes DOS/Unix.

Notez que PHP_EOL représente le caractère de fin de ligne pour l'élément actuel système. Par exemple, il ne trouvera pas de ligne de fin de Windows s'il est exécuté sur un système de type Unix.

11 votes

Doit-on l'utiliser comme caractère de fin de ligne lors de l'écriture d'un script en ligne de commande ?

6 votes

André : Qu'en est-il des personnes qui écrivent des applications destinées à être installées, utilisées et déployées par d'autres ? Suggérez-vous que toutes ces personnes devraient limiter leurs "plateformes supportées" à *nix ?

0 votes

@Andre Peut-être parce que votre plateforme de déploiement est Windows Azure ?

93voto

AlexV Points 8604

De main/php.h de la version 7.1.1 de PHP et de la version 5.6.30 :

#ifdef PHP_WIN32
#   include "tsrm_win32.h"
#   include "win95nt.h"
#   ifdef PHP_EXPORTS
#       define PHPAPI __declspec(dllexport)
#   else
#       define PHPAPI __declspec(dllimport)
#   endif
#   define PHP_DIR_SEPARATOR '\\'
#   define PHP_EOL "\r\n"
#else
#   if defined(__GNUC__) && __GNUC__ >= 4
#       define PHPAPI __attribute__ ((visibility("default")))
#   else
#       define PHPAPI
#   endif
#   define THREAD_LS
#   define PHP_DIR_SEPARATOR '/'
#   define PHP_EOL "\n"
#endif

Comme vous pouvez le constater PHP_EOL peut être "\r\n" (sur les serveurs Windows) ou "\n" (sur tout autre chose). Sur les versions de PHP avant 5.4.0RC8, il y avait une troisième valeur possible pour le paramètre PHP_EOL : "\r" (sur les serveurs MacOSX). Il était erroné et a été corrigé le 2012-03-01 avec bogue 61193 .

Comme d'autres vous l'ont déjà dit, vous pouvez utiliser PHP_EOL dans tout type de sortie (où tout de ces valeurs sont valides - comme : HTML, XML, logs...) où vous voulez des valeurs unifiées nouvelles lignes . N'oubliez pas que c'est le serveur qui détermine la valeur, et non le client. Vos visiteurs Windows obtiendront la valeur de votre serveur Unix, ce qui est parfois gênant pour eux.

Je voulais juste montrer les valeurs possibles de PHP_EOL soutenu par les sources du PHP puisqu'il n'a pas encore été montré ici...

3 votes

Wow. Les développeurs PHP ont tout faux sur ce point. Comme le lien Wikipedia que vous donnez le mentionne, Mac OS 9 et avant utilisaient " \r ", mais pas OS X, qui utilise " \n ". Quelqu'un devrait déposer un rapport de bogue...

31 votes

@imgx64 Oui peut-être, mais honnêtement, avez-vous déjà vu un serveur MAC en production ?

5 votes

@imgx64 Il a été corrigé 33 jours après votre message :) J'ai mis à jour ma réponse pour refléter les sources actuelles.

82voto

Zoredache Points 8873

Vous utilisez PHP_EOL quand vous voulez une nouvelle ligne, et vous voulez être multiplateforme.

Cela peut être le cas lorsque vous écrivez des fichiers sur le système de fichiers (journaux, exportations, autres).

Vous pouvez l'utiliser si vous voulez que le HTML généré soit lisible. Ainsi, vous pourriez suivre votre <br /> avec un PHP_EOL .

Vous l'utiliseriez si vous exécutez php en tant que script depuis cron et que vous avez besoin de sortir quelque chose et de le faire formater pour un écran.

Vous pouvez l'utiliser si vous préparez un courriel à envoyer qui nécessite une certaine mise en forme.

29 votes

Il n'est pas nécessaire d'utiliser des sauts de ligne indépendants de la plate-forme pour générer du HTML.

6 votes

@Rob, Si les anciennes versions d'IE me donnaient un meilleur visualiseur de page-source que le bloc-notes de Windows, j'aurais pu être d'accord avec vous.

17 votes

@Zoredache - le HTML sera généré avec les nouvelles lignes appropriées à la plate-forme sur laquelle PHP est exécuté, mais pas nécessairement à la plate-forme à partir de laquelle vous accédez aux pages.

21voto

Salman A Points 60620

PHP_EOL (chaîne) Le symbole "End Of Line" correct pour cette plateforme. Disponible depuis PHP 4.3.10 et PHP 5.0.2.

Vous pouvez utiliser cette constante lorsque vous lisez ou écrivez des fichiers texte sur le système de fichiers du serveur.

Les fins de ligne n'ont pas d'importance dans la plupart des cas, car la plupart des logiciels sont capables de traiter les fichiers texte quelle que soit leur origine. Vous devez être cohérent avec votre code.

Si les fins de ligne ont de l'importance, spécifiez explicitement les fins de ligne au lieu d'utiliser la constante. Par exemple :

  • En-têtes HTTP doit être séparés par \r\n
  • Fichiers CSV devrait utiliser \r\n comme séparateur de ligne

6 votes

Source pour "HTTP headers must be..." : ietf.org/rfc/rfc2616.txt chapitre 4 section 1

2 votes

SMTP lignes de messages doit être résilié par \r\n

10voto

ip.bastola Points 31

J'ai trouvé PHP_EOL très utile pour la gestion des fichiers, spécialement si vous écrivez plusieurs lignes de contenu dans un fichier.

Par exemple, vous avez une longue chaîne de caractères que vous voulez séparer en plusieurs lignes lors de l'écriture dans un fichier ordinaire. Utilisation de \r\n pourrait ne pas fonctionner, alors mettez simplement PHP_EOL dans votre script et le résultat est génial.

Regardez cet exemple simple ci-dessous :

<?php

$output = 'This is line 1' . PHP_EOL .
          'This is line 2' . PHP_EOL .
          'This is line 3';

$file = "filename.txt";

if (is_writable($file)) {
    // In our example we're opening $file in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $output will go when we fwrite() it.
    if (!$handle = fopen($file, 'a')) {
         echo "Cannot open file ($file)";
         exit;
    }
    // Write $output to our opened file.
    if (fwrite($handle, $output) === FALSE) {
        echo "Cannot write to file ($file)";
        exit;
    }
    echo "Success, content ($output) wrote to file ($file)";
    fclose($handle);
} else {
    echo "The file $file is not writable";
}
?>

3 votes

\n\r ne fonctionnera jamais comme la séquence est censée l'être. \r\n </pédanterie>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X