Domanda

Quando è una buona idea usare PHP_EOL ?

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

È stato utile?

Soluzione

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

Nota che PHP_EOL rappresenta il carattere finale per la corrente sistema. Ad esempio, non troverà un endline di Windows quando eseguito su un sistema simile a unix.

Altri suggerimenti

Da main / php.h di 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_EOL può essere " \ r \ n " (su server Windows) o " \ n " ( su qualsiasi altra cosa). Sulle versioni di PHP precedenti 5.4.0RC8, c'era un terzo valore possibile per PHP_EOL : " \ r " (su server MacOSX). Era sbagliato ed è stato risolto il 01-03-2012 con bug 61193 .

Come già detto da altri, puoi usare PHP_EOL in qualsiasi tipo di output (dove qualsiasi di questi valori sono validi - come: HTML, XML, log .. .) dove vuoi unificare newline . 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 di PHP_EOL supportato dalle fonti PHP poiché non è stato ancora mostrato qui ...

Usa PHP_EOL quando vuoi una nuova linea e vuoi essere multipiattaforma.

Potrebbe essere 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 un PHP_EOL .

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

È possibile utilizzarlo se si sta creando un messaggio di posta elettronica per inviare la formattazione necessaria.

  

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 riga non contano nella maggior parte dei casi in quanto 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 contano, specificare esplicitamente le terminazioni di riga anziché utilizzare la costante. Ad esempio:

  • Le intestazioni HTTP devono essere separate da \r\n
  • I file CSV dovrebbero usare \ r \ n come separatore di riga

Vorrei inserire una risposta che indirizza " Quando non per usarla " dato che non è ancora stato coperto e può immaginare che venga usato alla cieca e nessuno se ne accorga che c'è un problema fino a dopo. In parte ciò contraddice in parte alcune delle risposte esistenti.

Se invii a una pagina web in HTML, in particolare il testo in < textarea > , < pre > o < code > tu probabilmente vorrai sempre usare \ n e 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 visualizzazione delle pagine in alcuni browser (in particolare Internet Explorer - alcune versioni vedranno sia \ n che \ r).

Non sono sicuro che questo sia ancora un problema a partire da IE6 o no, quindi potrebbe essere piuttosto discutibile ma sembra degno di nota se aiuta le persone a sollecitare a pensare al contesto. Potrebbero esserci altri casi (come XHTML rigoroso) in cui l'output di \ r su 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 usarlo 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.

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 usano \ 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 () .

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

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, in realtà non esiste alcuna convenzione se non che dovresti essere coerente. Poiché la maggior parte dei server sono Unixy, ti consigliamo di utilizzare un " \ n " in ogni caso.

  • Se stai inviando a 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.

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";

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

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

DOS / Windows standard " newline " è 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).

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 utilizzo " \ r \ n " invece che funziona quando si apre il file su qualsiasi sistema operativo.

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

Ho riscontrato che molte istruzioni di debug sembrano strane sulla mia installazione di Windows poiché gli sviluppatori hanno assunto le terminazioni unix durante la suddivisione delle stringhe.

Stai scrivendo codice che utilizza prevalentemente stringhe di virgolette singole.

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

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.

Sto usando WebCalendar e ho scoperto che Mac iCal si limita a importare un file ics generato perché la fine della linea è hardcoded 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 " ;.

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

Bug molto fastidioso!

Usa PHP_EOL invece per ottenere il risultato che stavi cercando.

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 a volte ti è utile riesco a trovare questo costante e indefinito hosting moderno con l'ultimo motore php non ha questo problema, ma penso che una cosa buona sia scrivere un codice 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 script che dovrebbero funzionare su più sistemi contemporaneamente, altrimenti puoi usare \ n o \ r o \ 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 sia d'aiuto.

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 usato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top