Quando uso la costante PHP “PHP_EOL”?


360

Quando è una buona idea usare PHP_EOL?

A volte vedo questo negli esempi di codice di PHP. Questo gestisce i problemi di endline DOS / Mac / Unix?


1
Penso che ci siano molti consigli fuorvianti nelle risposte votate su questa pagina. Se si esegue uno script su due piattaforme diverse, quindi si confronta l'output o i dati generati (file di registro, pagina html, record del database ecc.), PHP_EOL comporterà una mancata corrispondenza nel diff. Nella maggior parte dei casi questo non è quello che vuoi.
donquixote,

Risposte:


357

Sì, PHP_EOLè apparentemente utilizzato per trovare il carattere di nuova riga in modo compatibile con più piattaforme, quindi gestisce i problemi DOS / Unix.

Si noti che PHP_EOL rappresenta il carattere di fine linea per il sistema corrente . Ad esempio, non troverà un endline di Windows quando eseguito su un sistema simile a unix.


9
Dovrebbe essere usato come carattere di fine riga quando si scrive uno script da riga di comando?
Thomas Owens,

5
@Andre: che ne dici di chiunque scriva app da installare, usare e distribuire da altri? Stai suggerendo che tutti dovrebbero limitare le loro "piattaforme supportate" a * nix?
Cilindrico

1
@Stann - Ciò che i "grandi progetti" di cui sei a conoscenza non è certo il fattore decisivo per le migliori pratiche, per non parlare di ciò che è o non è utile. Mantengo un "grande progetto" che viene distribuito in parte su diversi host, inclusi alcuni server Windows. Non dare per scontato: le costanti non danneggiano nulla e sono un modo perfettamente valido per scrivere codice indipendente dalla piattaforma. I tuoi commenti contrari sono alquanto assurdi.
Chris Baker,

5
No, non credo che la tua risposta sia corretta. Generare codice su un sistema ma inviare l'output a un altro sistema. PHP_EOL, tuttavia, indica il delimitatore di fine riga SOLO per il sistema in cui viene utilizzato. Non garantisce che l'altro sistema utilizzi lo stesso delimitatore. Vedi la mia risposta qui sotto.
StanE,

1
ma non utilizzare PHP_EOLper i dati pubblicati dal modulo.
Nabi KAZ,

88

Da main/php.hdi PHP versione 7.1.1 e versione 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

Come puoi vedere PHP_EOLpuò essere "\r\n"(su server Windows) o "\n"(su qualsiasi altra cosa). Nelle versioni PHP precedenti alla 5.4.0RC8, era possibile un terzo valore perPHP_EOL : "\r"(sui server MacOSX). Era errato ed è stato corretto il 01-03-2012 con il bug 61193 .

Come altri hanno già detto, è possibile utilizzare PHP_EOLin qualsiasi tipo di output (dove uno di questi valori è valido, ad esempio HTML, XML, log ...) in cui si desidera creare nuove righe unificate . Tieni presente che è il server a determinare il valore, non il client. I tuoi visitatori Windows otterranno il valore dal tuo server Unix che a volte è scomodo per loro.

Volevo solo mostrare i possibili valori PHP_EOLsupportati dalle fonti PHP poiché non è stato ancora mostrato qui ...


3
Wow. Gli sviluppatori PHP hanno torto su questo. Come link Wikipedia citi, Mac OS 9 e prima utilizzavano "\ r", ma non OS X, che utilizza "\ n". Qualcuno dovrebbe presentare una segnalazione di bug ...
imgx64,

27
@ imgx64 Sì, forse, ma onestamente hai mai visto un server MAC di produzione?
AlexV,

3
@ imgx64 È stato corretto 33 giorni dopo il tuo post :) Ho aggiornato la mia risposta per riflettere le fonti attuali.
AlexV

2
Non penso che l'argomento per usare PHP_EOL per l'output (!) Sia valido. PHP_EOL è lato server mentre l'output è normalmente per il client (che utilizza delimitatori di fine riga diversi). Esempio: se si crea un output di testo semplice su più righe su un sistema Linux con PHP_EOL e lo si invia a un sistema Windows, non sarà un delimitatore di fine riga valido - dipenderà dal software client che visualizzerà l'output. I browser e alcuni editor di testo potrebbero gestirlo, ma se si visualizza il testo ad esempio in Blocco note, tutto sarà su una riga.
StanE,

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"per scoprirlo.
Bob Stein,

82

Usi PHP_EOLquando vuoi una nuova linea e vuoi essere multipiattaforma.

Questo può accadere quando si scrivono file nel filesystem (registri, esportazioni, altro).

Potresti usarlo se vuoi che il tuo HTML generato sia leggibile. Quindi potresti seguire il tuo <br />con aPHP_EOL .

Lo useresti se stai eseguendo php come script da cron e hai bisogno di produrre qualcosa e di formattarlo per uno schermo.

È possibile utilizzarlo se si sta creando un messaggio di posta elettronica per l'invio che richiede una formattazione.


25
Non è necessario utilizzare newline indipendenti dalla piattaforma durante la generazione di HTML.
Rob,

6
@Rob, se le versioni precedenti di IE mi offrissero un visualizzatore di sorgenti di pagine migliore del blocco note di Windows, avrei potuto essere d'accordo con te.
Zoredache,

14
@Zoredache: l'HTML verrà generato con nuove righe appropriate per la piattaforma su cui PHP è in esecuzione, non necessariamente appropriato per la piattaforma da cui accedi alle pagine.
Dominic Rodger,

2
+1 per menzionare l'edificio della posta elettronica $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba,

49
PHP_EOLnon deve essere utilizzato per separare le intestazioni delle e-mail. Secondo il manuale di PHP Mail , più intestazioni extra dovrebbero essere separate con un CRLF (\ r \ n).
Halil Özgür,

19

PHP_EOL (stringa) Il simbolo "Fine linea" corretto per questa piattaforma. Disponibile da PHP 4.3.10 e PHP 5.0.2

Puoi usare questa costante quando leggi o scrivi file di testo sul filesystem del server.

Le terminazioni di linea non contano nella maggior parte dei casi poiché la maggior parte dei software è in grado di gestire file di testo indipendentemente dalla loro origine. Dovresti essere coerente con il tuo codice.

Se le terminazioni di riga sono importanti, specifica esplicitamente le terminazioni di riga anziché utilizzare la costante. Per esempio:

  • Le intestazioni HTTP devono essere separate da\r\n
  • I file CSV devono essere usati \r\ncome separatori di riga

5
fonte per "Le intestazioni HTTP devono essere ...": ietf.org/rfc/rfc2616.txt capitolo 4 sezione 1
Adrian Föder

2
Le righe dei messaggi SMTP devono essere terminate da\r\n
Bob Stein il

12

Vorrei inserire una risposta che si rivolge "Quando no usarlo" in quanto non è stato ancora coperto e posso immaginare che venga usato alla cieca e nessuno nota che c'è un problema fino a tardi. Parte di ciò contraddice in parte alcune delle risposte esistenti.

Se stai inviando a una pagina web in HTML, in particolare il testo in <textarea>, <pre>o <code>probabilmente vuoi sempre usarlo \ne non PHP_EOL.

La ragione di ciò è che mentre il codice può funzionare bene su un server - che sembra essere una piattaforma simile a Unix - se distribuito su un host Windows (come la piattaforma Windows Azure), può alterare la modalità di visualizzazione delle pagine in alcuni browser (in particolare Internet Explorer: alcune versioni vedranno sia \ n che \ r).

Non sono sicuro se questo sia ancora un problema dopo IE6 o no, quindi potrebbe essere piuttosto discutibile ma sembra degno di nota se aiuta le persone a spingere a pensare al contesto. Potrebbero esserci altri casi (come l'XHTML rigoroso) in cui si presenta di colpo\r alcune piattaforme potrebbe causare problemi con l'output, e sono sicuro che ci sono altri casi limite come quello.

Come già notato da qualcuno, non vorrai utilizzarlo quando restituisci le intestazioni HTTP, poiché dovrebbero sempre seguire la RFC su qualsiasi piattaforma.

Non lo userei per qualcosa come delimitatori sui file CSV (come qualcuno ha suggerito). La piattaforma su cui è in esecuzione il server non dovrebbe determinare le terminazioni di riga nei file generati o consumati.


10

Ho trovato PHP_EOL molto utile per la gestione dei file, specialmente se stai scrivendo più righe di contenuto in un file.

Ad esempio, hai una lunga stringa che vuoi dividere in più righe mentre scrivi in ​​un file semplice. L'uso di \ r \ n potrebbe non funzionare, quindi inserisci PHP_EOL nello script e il risultato è fantastico.

Dai un'occhiata a questo semplice esempio di seguito:

<?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
\ n \ r non funzionerà mai poiché la sequenza dovrebbe essere \ r \ n </pedantry>
frak,

10

No, PHP_EOL non gestisce i problemi di endline, perché il sistema in cui si utilizza quella costante non è lo stesso sistema a cui si invia l'output.

Non consiglierei affatto di usare PHP_EOL. Unix / Linux usa \ n, anche MacOS / OS X è cambiato da \ r a \ n e su Windows molte applicazioni (specialmente i browser) possono visualizzarlo correttamente. Su Windows, è anche facile cambiare il codice lato client esistente per usare solo \ n e mantenere comunque la retrocompatibilità: basta cambiare il delimitatore per il taglio della linea da \ r \ n a \ n e avvolgerlo in una funzione simile a trim () .


3
Sarebbe bello sapere perché la mia risposta è sottovalutata ... Pazza ... La risposta accettata è sbagliata , mentre la mia è corretta. In genere non è corretto affermare che PHP_EOL gestisce il problema. Può (e dovrebbe) essere usato se si legge o scrive SOLO qualcosa sullo / dallo stesso sistema. Ma la maggior parte delle volte PHP viene utilizzato per inviare qualcosa al client (che è molto probabilmente ciò a cui pensava il soggetto). Ancora una volta: PHP_EOL è una costante sul lato server. NON gestisce (e non può) gestire correttamente le interruzioni della linea lato client. Per favore, scrivi un commento e dimmi, se pensi che ho scritto qualcosa di sbagliato.
StanE

3
+1 per fare un buon punto contro il grano. Penso che sia perso perché i browser non rendono gli spazi bianchi in HTML, quindi l'uso comune sarebbe per le applicazioni console. E come hai detto, in tal caso la fine della linea verrebbe interpretata per l'ambiente in esecuzione, il che ha senso per le app della console, ma non per le applicazioni web client-server.
Jeff Puckett,

Bene, la risposta non si riferisce davvero. Si menziona la compatibilità del browser e l'invio di file ad altri sistemi. Newline è rilevante nell'output del testo, quindi i browser non sono rilevanti. E contrariamente al punto principale, questi file di testo vengono generalmente consumati sulla stessa piattaforma su cui sono scritti.
grantwparks,

6

La definizione di PHP_EOL è che ti dà il carattere newline del sistema operativo su cui stai lavorando.

In pratica, non dovresti quasi mai aver bisogno di questo. Considera alcuni casi:

  • Quando esci sul web, non c'è davvero alcuna convenzione se non che dovresti essere coerente. Poiché la maggior parte dei server sono Unixy, ti consigliamo comunque di utilizzare un "\ n".

  • Se stai inviando un file, PHP_EOL potrebbe sembrare una buona idea. Tuttavia, puoi ottenere un effetto simile avendo una nuova riga letterale all'interno del tuo file, e questo ti aiuterà se stai cercando di eseguire alcuni file formattati CRLF su Unix senza ostruire le nuove linee esistenti (come un ragazzo con un sistema a doppio avvio , Posso dire che preferisco quest'ultimo comportamento)

PHP_EOL è così ridicolmente lungo che non vale davvero la pena usarlo.


33
-1 per "PHP_EOL è così ridicolmente lungo". Non è un argomento valido.
viam0Zah,

1
Sono completamente d'accordo con voi. Non ha alcun senso distribuire php su qualsiasi cosa tranne * nix. Pertanto, non ha senso utilizzare PHP_EOL o DIRECTORY_SEPARATOR.
Stann,

@Stann Puoi spiegare il tuo punto su "Non ha alcun senso implementare php su qualcosa che non sia * nix"?
Sajuuk,

2
@Sajuuk Credo che si chiamerebbe "sarcasmo".
Félix Gagnon-Grenier,

3

C'è un posto ovvio in cui potrebbe essere utile: quando scrivi un codice che usa prevalentemente stringhe di virgolette singole. È discutibile se:

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

La sua arte deve essere coerente. Il problema con il mix and matching '' e "" è che quando ottieni stringhe lunghe, non vuoi davvero andare a caccia per quale tipo di citazione hai usato.

Come per tutte le cose della vita, dipende dal contesto.


3

"Newline" standard DOS / Windows è CRLF (= \ r \ n) e non LFCR (\ n \ r). Se mettiamo quest'ultimo, è probabile che produca comportamenti inaspettati (beh, in effetti, un po 'attesi!: D).

Oggi quasi tutti i programmi (ben scritti) accettano lo standard UNIX LF (\ n) per il codice newline, anche i demoni del mittente della posta (RFC imposta CRLF come newline per le intestazioni e il corpo del messaggio).


2

Comodo con error_log () se stai emettendo più righe.

Ho trovato molte dichiarazioni di debug sembrare strane sulla mia installazione di Windows poiché gli sviluppatori hanno assunto terminazioni unix quando hanno rotto le stringhe.


2

Uso la costante PHP_EOL in alcuni script da riga di comando che ho dovuto scrivere. Sviluppo sul mio computer Windows locale e test su un server Linux. L'uso della costante significava che non dovevo preoccuparmi di usare il finale di linea corretto per ciascuna delle diverse piattaforme.


2

Ho un sito in cui uno script di registrazione scrive una nuova riga di testo in un file di testo dopo un'azione dell'utente, che può utilizzare qualsiasi sistema operativo.

L'uso di PHP_EOL non sembra essere ottimale in questo caso. Se l'utente è su Mac OS e scrive nel file di testo, inserirà \ n. Quando si apre il file di testo su un computer Windows non mostra un'interruzione di riga. Per questo motivo uso "\ r \ n" invece che funziona quando si apre il file su qualsiasi sistema operativo.


1

Stai scrivendo codice che utilizza prevalentemente stringhe a virgoletta singola.

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

0

Sto usando WebCalendar e ho scoperto che Mac iCal barfora sull'importazione di un file ics generato perché la fine della riga è codificata in xcal.php come "\ r \ n". Sono entrato e ho sostituito tutte le occorrenze con PHP_EOL e ora iCal è felice! L'ho anche provato su Vista e Outlook è stato in grado di importare anche il file, anche se il carattere di fine riga è "\ n".


<late> Ciò significa che l'applicazione non funzionerà correttamente quando viene distribuita su un server Windows. Se vuoi \n, usalo esplicitamente.
duskwuff -inattivo-

0

Quando jumi (plugin joomla per PHP) compila il tuo codice per qualche motivo rimuove tutte le barre rovesciate dal tuo codice. Tale che qualcosa del genere$csv_output .= "\n"; diventa$csv_output .= "n";

Bug molto fastidioso!

Utilizza invece PHP_EOL per ottenere il risultato che stavi cercando.


2
Spero davvero VERAMENTE che questo sia un problema di configurazione che non hai ancora trovato. non ho mai usato joomla, ma che comportamento terribile se funziona davvero!
jon_darkstar,

0

Su alcuni sistemi può essere utile usare questa costante perché se, ad esempio, stai inviando un'e-mail, puoi usare PHP_EOL per avere uno script tra sistemi che funzioni su più sistemi ... ma anche se è utile a volte puoi trovare questo l'hosting costante indefinito e moderno con l'ultimo motore php non presenta questo problema ma penso che una cosa positiva sia scrivere un codice bit che salvi questa situazione:

<?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");
    }
  }
?>

Quindi puoi usare PHP_EOL senza problemi ... ovvio che PHP_EOL dovrebbe essere usato su uno script che dovrebbe funzionare su più sistemi contemporaneamente, altrimenti puoi usare \ n oppure \ r oppure \ r \ n ...

Nota: PHP_EOL può essere

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

Spero che questa risposta aiuti.


0

Ho appena riscontrato questo problema durante l'output su un client Windows. Certo, PHP_EOL è per lato server, ma la maggior parte dell'output di contenuto da php è per client Windows. Quindi devo mettere i miei risultati qui per la prossima persona.

A) echo "My Text". PHP_EOL; // Cattivo perché genera solo \ n e la maggior parte delle versioni del blocco note di Windows lo visualizza su una sola riga e la maggior parte dei software di contabilità di Windows non può importare questo tipo di carattere di fine riga.

B) echo "Testo personale \ r \ n"; // Cattivo perché le stringhe php a virgoletta singola non interpretano \ r \ n

C) echo "Testo personale \ r \ n"; // Yay funziona! Sembra corretto nel blocco note e funziona durante l'importazione del file in altri software Windows come Windows Accounting e Windows Manufacturing Software.


-2

Preferisco usare \ n \ r. Anche io sono su un sistema Windows e \ n funziona bene nella mia esperienza.

Dal momento che PHP_EOL non funziona con le espressioni regolari e questi sono il modo più utile di trattare il testo, allora non l'ho mai usato o ne avevo bisogno.


12
Fai attenzione al nuovo ordine dei caratteri, dovrebbe essere \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline
azkotoki

Non lo usi, ma il tuo sito può essere aperto da chiunque su qualsiasi PC, quindi potrebbe essere un problema
Owaiz Yusufi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.