web-dev-qa-db-fra.com

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

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

Je vois parfois cela dans des exemples de code PHP. Est-ce que cela gère les problèmes finaux DOS/Mac/Unix?

339
Christian Oudard

Oui, PHP_EOL est apparemment utilisé pour rechercher le caractère de nouvelle ligne d'une manière compatible entre plates-formes, de sorte qu'il gère les problèmes de DOS/Unix.

Notez que PHP_EOL représente le caractère final du système actuel . Par exemple, il ne trouvera pas de fin Windows quand il est exécuté sur un système de type Unix.

338
Adam Bellaire

De main/php.h de PHP version 7.1.1 et 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 voir, PHP_EOL peut être "\r\n" (sur les serveurs Windows) ou "\n" (sur tout le reste). Sur PHP versions avant 5.4.0RC8, une troisième valeur était possible pour PHP_EOL: "\r" (sur les serveurs MacOSX). C'était faux et a été corrigé le 01/03/2012 avec bug 6119 .

Comme d’autres l’ont déjà dit, vous pouvez utiliser PHP_EOL dans n’importe quel type de sortie (où n’importe laquelle de ces valeurs est valide - comme: HTML, XML, journaux ...) où vous voulez unifié nouvelles lignes . N'oubliez pas que c'est le serveur qui détermine la valeur, pas 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 PHP puisqu'il n'a pas encore été montré ici ...

85
AlexV

Vous utilisez PHP_EOL lorsque vous souhaitez une nouvelle ligne et que vous souhaitez être multiplate-forme.

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 votre code HTML généré soit lisible. Vous pouvez donc suivre votre <br /> avec un PHP_EOL.

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

Vous pouvez l'utiliser si vous créez un courrier électronique pour envoyer un message nécessitant un certain formatage.

80
Zoredache

PHP_EOL (chaîne de caractères) Le symbole 'Fin de ligne' correct pour cette plate-forme. 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 importent peu dans la plupart des cas car la plupart des logiciels sont capables de gérer des fichiers texte quelle que soit leur origine. Vous devez être cohérent avec votre code.

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

  • Les en-têtes HTTP doivent être séparés par \r\n
  • Les fichiers CSV devraient utiliser \r\n comme séparateur de lignes
19
Salman A

Je voudrais donner une réponse qui aborde "Quand pas à l'utiliser" car il n'a pas encore été couvert et peut imaginer qu'il soit utilisé aveuglément et que personne ne le remarquant pose un problème jusqu'à ce que plus tard sur la ligne. Certaines de ces contradictions contredisent quelque peu les réponses existantes.

Si vous affichez une page Web au format HTML, en particulier du texte dans <textarea>, <pre> ou <code>, vous souhaiterez probablement toujours utiliser \n et non PHP_EOL.

La raison en est que, bien que le code puisse fonctionner correctement sur un serveur - qui se trouve être une plate-forme de type Unix -, s'il est déployé sur un hôte Windows (comme la plate-forme Windows Azure), il peut modifier le mode d'affichage des pages dans certains navigateurs. (en particulier Internet Explorer - certaines versions verront à la fois le\n et le\r).

Je ne sais pas si c'est toujours un problème depuis IE6 ou pas, donc cela pourrait être assez théorique, mais il semble utile de le mentionner si cela aide les gens à réfléchir rapidement au contexte. Il peut y avoir d'autres cas (tels que XHTML strict) où le fait de sortir soudainement \r 'sur certaines plates-formes pourrait causer des problèmes de sortie, et je suis sûr qu'il existe d'autres cas Edge similaires.

Comme déjà noté par quelqu'un, vous ne voudriez pas l'utiliser pour renvoyer des en-têtes HTTP - car ils devraient toujours suivre le RFC sur n'importe quelle plate-forme.

Je ne l'utiliserais pas pour quelque chose comme les délimiteurs sur les fichiers CSV (comme quelqu'un l'a suggéré). La plate-forme sur laquelle le serveur s'exécute ne doit pas déterminer les fins de ligne dans les fichiers générés ou utilisés.

12
Iain Collins

Non, PHP_EOL ne gère pas les problèmes finaux, car le système sur lequel vous utilisez cette constante n'est pas le même système que celui sur lequel vous envoyez la sortie.

Je ne recommanderais pas du tout d'utiliser PHP_EOL. Unix/Linux utilisé\n, MacOS/OS X est également passé de\r à\n et sous Windows, de nombreuses applications (notamment les navigateurs) peuvent également l’afficher correctement. Sous Windows, il est également facile de changer le code côté client existant en utilisant uniquement\n tout en conservant la compatibilité ascendante: il suffit de changer le délimiteur pour le rognage de ligne de\r\n à\n et de l'envelopper dans une fonction semblable à trim () .

10
StanE

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

Par exemple, vous avez une longue chaîne que vous souhaitez fractionner en plusieurs lignes lors de l'écriture dans un fichier brut. L'utilisation de\r\n peut ne pas fonctionner, insérez simplement PHP_EOL dans votre script et le résultat est impressionnant.

Découvrez 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";
}
?>
9
ip bastola

La définition de PHP_EOL est qu’elle vous donne le caractère de nouvelle ligne du système d’exploitation sur lequel vous travaillez.

En pratique, vous ne devriez presque jamais avoir besoin de cela. Considérons quelques cas:

  • Lorsque vous effectuez une sortie sur le Web, il n'y a pas vraiment de convention, mais vous devez être cohérent. Comme la plupart des serveurs sont Unixy, vous voudrez quand même utiliser un "\ n".

  • Si vous exportez dans un fichier, PHP_EOL peut sembler une bonne idée. Cependant, vous pouvez obtenir un effet similaire en introduisant un trait nouveau littéral dans votre fichier. Cela vous aidera si vous essayez d'exécuter des fichiers au format CRLF sous Unix sans écraser les traits nouveaux existants (comme un gars avec un système à double démarrage , Je peux dire que je préfère ce dernier comportement)

PHP_EOL est tellement ridiculement long qu'il ne vaut vraiment pas la peine de l'utiliser.

7
Edward Z. Yang

La "nouvelle ligne" standard sous DOS/Windows est CRLF (=\r\n) et non LFCR (\ n\r). Si nous posons ce dernier point, cela produira probablement des comportements inattendus (enfin, en quelque sorte, attendus!: D).

Aujourd'hui, presque tous les programmes (bien écrits) acceptent la norme UNIX LF (\ n) pour le code de nouvelle ligne, même les démons expéditeurs de courrier (RFC définit CRLF comme nouvelle ligne pour les en-têtes et le corps du message).

3
Nica Mlg

Cela peut être utile à un endroit évident: lorsque vous écrivez du code qui utilise principalement des chaînes de guillemets simples. On peut se demander si:

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";

L'art est d'être cohérent. Le problème avec la combinaison et le "" et "" est que lorsque vous avez de longues chaînes, vous ne voulez pas vraiment avoir à chercher quel type de citation vous avez utilisé.

Comme dans toutes les choses de la vie, cela dépend du contexte.

3
SjH

J'ai un site où un script de journalisation écrit une nouvelle ligne de texte dans un fichier texte après une action de l'utilisateur, qui peut utiliser n'importe quel système d'exploitation.

Utiliser PHP_EOL ne semble pas être optimal dans ce cas. Si l'utilisateur est sous Mac OS et écrit dans le fichier texte, il mettra\n. Lorsque vous ouvrez le fichier texte sur un ordinateur Windows, il ne montre pas de saut de ligne. C'est pour cette raison que j'utilise "\ r\n" à la place, ce qui fonctionne lors de l'ouverture du fichier sous n'importe quel système d'exploitation.

2
intTiger

Vous écrivez du code qui utilise principalement des chaînes de guillemets simples.

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";
1
Vasu_Sharma

Pratique avec error_log () si vous produisez plusieurs lignes.

J'ai trouvé beaucoup d'instructions de débogage qui ont l'air bizarre sur mon installation de Windows puisque les développeurs ont supposé des terminaisons Unix lors de la rupture de chaînes.

1
Gavin Gilmour

J'utilise WebCalendar et j'ai constaté que Mac iCal bloquait l'importation d'un fichier ics généré, car la fin de ligne est codée en dur dans xcal.php en tant que "\ r\n". Je suis entré et j'ai remplacé toutes les occurrences par PHP_EOL et maintenant, iCal est heureux! Je l'ai également testé sur Vista et Outlook a également été en mesure d'importer le fichier, même si le caractère de fin de ligne est "\ n".

0
Lex

Lorsque jumi (plugin joomla pour PHP) compile votre code pour une raison quelconque, il supprime toutes les barres obliques inverses de votre code. De telle sorte que quelque chose comme $csv_output .= "\n"; devient $csv_output .= "n";

Bug très ennuyant!

Utilisez plutôt PHP_EOL pour obtenir le résultat recherché.

0
Allan

J'utilise la constante PHP_EOL dans certains scripts en ligne de commande que j'ai dû écrire. Je développe sur ma machine Windows locale puis teste sur un serveur Linux. Utiliser la constante signifiait que je n'avais pas à m'inquiéter d'utiliser la bonne fin de ligne pour chacune des différentes plates-formes.

0
chrismacp

Sur certains systèmes, il peut être utile d’utiliser cette constante car, par exemple, si vous envoyez un courrier électronique, vous pouvez utiliser PHP_EOL pour avoir un script inter-système fonctionnant sur plusieurs systèmes ... mais même si cela est utile, vous pouvez le trouver un hébergement constant et indéfini, avec le dernier moteur php, n’a pas ce problème, mais je pense qu’une bonne chose est d’écrire un code binaire qui enregistre cette situation:

<?php
  if (!defined('PHP_EOL')) {
    if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
      define('PHP_EOL',"\r\n");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
      define('PHP_EOL',"\r");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'DAR')) {
      define('PHP_EOL',"\n");
    } else {
      define('PHP_EOL',"\n");
    }
  }
?>

Vous pouvez donc utiliser PHP_EOL sans problème ... Il est évident que PHP_EOL doit être utilisé sur un script qui doit fonctionner sur plusieurs systèmes à la fois, sinon vous pouvez utiliser\n ou\r ou\r\n ...

Note: PHP_EOL peut être

1) on Unix    LN    == \n
2) on Mac     CR    == \r
3) on Windows CR+LN == \r\n

J'espère que cette réponse aide.

0
Alessandro