Wann ist es eine gute Idee zu verwenden PHP_EOL
?
Ich sehe dies manchmal in Codebeispielen von PHP. Behandelt dies DOS / Mac / Unix-Endline-Probleme?
Wann ist es eine gute Idee zu verwenden PHP_EOL
?
Ich sehe dies manchmal in Codebeispielen von PHP. Behandelt dies DOS / Mac / Unix-Endline-Probleme?
Antworten:
Ja, PHP_EOL
wird angeblich verwendet, um das Zeilenumbruchzeichen plattformübergreifend zu finden, sodass DOS / Unix-Probleme behandelt werden.
Beachten Sie, dass PHP_EOL das Endzeilenzeichen für das aktuelle System darstellt. Beispielsweise wird keine Windows-Endzeile gefunden, wenn sie auf einem Unix-ähnlichen System ausgeführt wird.
PHP_EOL
für Daten verwenden, die aus dem Formular gesendet werden.
Ab main/php.h
PHP Version 7.1.1 und 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
Wie Sie sehen PHP_EOL
können, kann "\r\n"
(auf Windows-Servern) oder "\n"
(auf irgendetwas anderem) sein. In PHP-Versionen vor 5.4.0RC8 war ein dritter Wert möglich für PHP_EOL
: "\r"
(auf MacOSX-Servern). Es war falsch und wurde am 2012-03-01 mit Fehler 61193 behoben .
Wie andere Ihnen bereits gesagt haben, können Sie PHP_EOL
in jeder Art von Ausgabe (wo einer dieser Werte gültig ist - wie z. B. HTML, XML, Protokolle ...) einheitliche Zeilenumbrüche verwenden . Denken Sie daran, dass es der Server ist, der den Wert bestimmt, nicht der Client. Ihre Windows-Besucher erhalten den Wert von Ihrem Unix-Server, was für sie manchmal unpraktisch ist.
Ich wollte nur die möglichen Werte von PHP_EOL
PHP-Quellen zeigen, da diese hier noch nicht gezeigt wurden ...
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"
herausfinden.
Sie verwenden, PHP_EOL
wenn Sie eine neue Leitung möchten und plattformübergreifend sein möchten.
Dies kann der Fall sein, wenn Sie Dateien in das Dateisystem schreiben (Protokolle, Exporte usw.).
Sie können es verwenden, wenn Ihr generiertes HTML lesbar sein soll. So könnten Sie Ihrem <br />
mit einem folgen PHP_EOL
.
Sie würden es verwenden, wenn Sie PHP als Skript von Cron ausführen und etwas ausgeben und es für einen Bildschirm formatieren müssen.
Sie können es verwenden, wenn Sie eine E-Mail zum Senden erstellen, für die eine Formatierung erforderlich ist.
$header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
PHP_EOL
sollte nicht zum Trennen von E-Mail-Headern verwendet werden. Laut PHP Mail- Handbuch sollten mehrere zusätzliche Header mit einer CRLF (\ r \ n) getrennt werden.
PHP_EOL (Zeichenfolge) Das richtige Symbol für das Zeilenende für diese Plattform. Verfügbar seit PHP 4.3.10 und PHP 5.0.2
Sie können diese Konstante verwenden, wenn Sie Textdateien im Dateisystem des Servers lesen oder schreiben.
Zeilenenden spielen in den meisten Fällen keine Rolle, da die meisten Programme Textdateien unabhängig von ihrer Herkunft verarbeiten können. Sie sollten mit Ihrem Code übereinstimmen.
Wenn Zeilenenden wichtig sind, geben Sie die Zeilenenden explizit an, anstatt die Konstante zu verwenden. Zum Beispiel:
\r\n
\r\n
als ZeilentrennIch möchte eine Antwort einwerfen, die sich mit "Wann nicht verwenden" befasst, da sie noch nicht behandelt wurde, und ich kann mir vorstellen, dass sie blind verwendet wird und niemand bemerkt, dass es bis später ein Problem gibt. Einige davon widersprechen einigen der vorhandenen Antworten etwas.
Wenn Sie auf einer Webseite in HTML ausgeben, insbesondere in Text <textarea>
, <pre>
oder <code>
wenn Sie wahrscheinlich immer verwenden möchten \n
und nicht PHP_EOL
.
Der Grund dafür ist, dass Code zwar auf einem Server - der zufällig eine Unix-ähnliche Plattform ist - gut funktioniert, wenn er jedoch auf einem Windows-Host (z. B. der Windows Azure-Plattform) bereitgestellt wird, die Darstellung von Seiten in einigen Browsern möglicherweise ändert (speziell Internet Explorer - in einigen Versionen werden sowohl \ n als auch \ r angezeigt).
Ich bin mir nicht sicher, ob dies seit IE6 immer noch ein Problem ist oder nicht, daher ist es vielleicht ziemlich umstritten, aber es scheint erwähnenswert zu sein, wenn es den Leuten hilft, über den Kontext nachzudenken. Es kann andere Fälle geben (wie z. B. striktes XHTML), in denen eine plötzliche Ausgabe \r
auf einigen Plattformen Probleme mit der Ausgabe verursachen kann, und ich bin sicher, dass es andere Randfälle wie diesen gibt.
Wie bereits von jemandem bemerkt, möchten Sie es nicht verwenden, wenn Sie HTTP-Header zurückgeben, da diese auf jeder Plattform immer dem RFC folgen sollten.
Ich würde es nicht für Trennzeichen in CSV-Dateien verwenden (wie jemand vorgeschlagen hat). Die Plattform, auf der der Server ausgeführt wird, sollte die Zeilenenden in generierten oder konsumierten Dateien nicht bestimmen.
Ich fand PHP_EOL sehr nützlich für die Dateiverwaltung, insbesondere wenn Sie mehrere Inhaltszeilen in eine Datei schreiben.
Beispielsweise haben Sie eine lange Zeichenfolge, die Sie beim Schreiben in eine einfache Datei in mehrere Zeilen aufteilen möchten. Die Verwendung von \ r \ n funktioniert möglicherweise nicht. Fügen Sie einfach PHP_EOL in Ihr Skript ein, und das Ergebnis ist fantastisch.
Schauen Sie sich dieses einfache Beispiel unten an:
<?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";
}
?>
Nein, PHP_EOL behandelt keine Endline-Probleme, da das System, an das Sie diese Konstante verwenden, nicht dasselbe System ist, an das Sie die Ausgabe senden.
Ich würde die Verwendung von PHP_EOL überhaupt nicht empfehlen. Unix / Linux verwenden \ n, MacOS / OS X wurde ebenfalls von \ r nach \ n geändert und unter Windows können viele Anwendungen (insbesondere Browser) es auch korrekt anzeigen. Unter Windows ist es auch einfach, vorhandenen clientseitigen Code so zu ändern, dass er nur \ n verwendet und dennoch die Abwärtskompatibilität beibehält: Ändern Sie einfach das Trennzeichen für das Trimmen von Zeilen von \ r \ n in \ n und schließen Sie es in eine trim () -ähnliche Funktion ein .
Die Definition von PHP_EOL ist, dass es Ihnen den Zeilenumbruchcharakter des Betriebssystems gibt, an dem Sie arbeiten.
In der Praxis sollten Sie dies fast nie brauchen. Betrachten Sie einige Fälle:
Wenn Sie im Web ausgeben, gibt es wirklich keine Konvention, außer dass Sie konsistent sein sollten. Da die meisten Server Unixy sind, sollten Sie trotzdem ein "\ n" verwenden.
Wenn Sie in eine Datei ausgeben, scheint PHP_EOL eine gute Idee zu sein. Sie können jedoch einen ähnlichen Effekt erzielen, indem Sie eine wörtliche neue Zeile in Ihrer Datei haben. Dies hilft Ihnen, wenn Sie versuchen, einige CRLF-formatierte Dateien unter Unix auszuführen, ohne vorhandene neue Zeilen zu beschädigen (als Typ mit einem Dual-Boot-System) Ich kann sagen, dass ich das letztere Verhalten bevorzuge.
PHP_EOL ist so lächerlich lang, dass es sich wirklich nicht lohnt, es zu benutzen.
Es gibt einen offensichtlichen Ort, an dem dies nützlich sein könnte: Wenn Sie Code schreiben, der überwiegend einfache Anführungszeichen verwendet. Es ist fraglich, ob:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Die Kunst ist es, konsequent zu sein. Das Problem beim Mischen und Anpassen von '' und "" ist, dass Sie, wenn Sie lange Zeichenfolgen erhalten, nicht wirklich nach der Art des Zitats suchen müssen, das Sie verwendet haben.
Wie bei allen Dingen im Leben kommt es auf den Kontext an.
DOS / Windows-Standard "newline" ist CRLF (= \ r \ n) und nicht LFCR (\ n \ r). Wenn wir letzteres sagen, wird es wahrscheinlich zu unerwarteten (tatsächlich erwarteten!: D) Verhaltensweisen kommen.
Heutzutage akzeptieren fast alle (gut geschriebenen) Programme den UNIX-Standard LF (\ n) für Zeilenumbruchcode, sogar Mail-Absender-Daemons (RFC legt CRLF als Zeilenumbruch für Header und Nachrichtentext fest).
Praktisch mit error_log (), wenn Sie mehrere Zeilen ausgeben.
Ich habe festgestellt, dass viele Debug-Anweisungen in meiner Windows-Installation seltsam aussehen, da die Entwickler beim Aufbrechen von Zeichenfolgen Unix-Endungen angenommen haben.
Ich verwende die PHP_EOL-Konstante in einigen Befehlszeilenskripten, die ich schreiben musste. Ich entwickle auf meinem lokalen Windows-Computer und teste dann auf einer Linux-Server-Box. Die Verwendung der Konstante bedeutete, dass ich mich nicht um die Verwendung des richtigen Zeilenendes für jede der verschiedenen Plattformen kümmern musste.
Ich habe eine Site, auf der ein Protokollierungsskript nach einer Aktion des Benutzers, der ein beliebiges Betriebssystem verwenden kann, eine neue Textzeile in eine Textdatei schreibt.
Die Verwendung von PHP_EOL scheint in diesem Fall nicht optimal zu sein. Wenn der Benutzer unter Mac OS arbeitet und in die Textdatei schreibt, wird \ n eingefügt. Beim Öffnen der Textdatei auf einem Windows-Computer wird kein Zeilenumbruch angezeigt. Aus diesem Grund verwende ich stattdessen "\ r \ n", was beim Öffnen der Datei auf einem beliebigen Betriebssystem funktioniert.
Sie schreiben Code, der überwiegend einfache Anführungszeichen verwendet.
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Ich verwende WebCalendar und habe festgestellt, dass Mac iCal beim Importieren einer generierten ICS-Datei gesperrt ist, da das Zeilenende in xcal.php als "\ r \ n" fest codiert ist. Ich ging hinein und ersetzte alle Vorkommen durch PHP_EOL und jetzt ist iCal glücklich! Ich habe es auch unter Vista getestet und Outlook konnte die Datei auch importieren, obwohl das Zeilenendezeichen "\ n" ist.
\n
, verwenden Sie dies explizit.
Wenn jumi (Joomla-Plugin für PHP) Ihren Code aus irgendeinem Grund kompiliert, werden alle Backslashes aus Ihrem Code entfernt. So etwas wie$csv_output .= "\n";
wird$csv_output .= "n";
Sehr nerviger Bug!
Verwenden Sie stattdessen PHP_EOL, um das gewünschte Ergebnis zu erhalten.
Auf einigen Systemen kann es nützlich sein, diese Konstante zu verwenden, denn wenn Sie beispielsweise eine E-Mail senden, können Sie PHP_EOL verwenden, um ein systemübergreifendes Skript auf mehreren Systemen auszuführen ... aber selbst wenn es manchmal nützlich ist, können Sie dies finden Konstantes undefiniertes, modernes Hosting mit der neuesten PHP-Engine hat dieses Problem nicht, aber ich denke, dass es gut ist, einen Bitcode zu schreiben, der diese Situation rettet:
<?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");
}
}
?>
Sie können also PHP_EOL problemlos verwenden ... offensichtlich sollte PHP_EOL für Skripte verwendet werden, die auf mehreren Systemen gleichzeitig funktionieren sollten, andernfalls können Sie \ n oder \ r oder \ r \ n verwenden ...
Hinweis: PHP_EOL kann sein
1) on Unix LN == \n
2) on Mac CR == \r
3) on Windows CR+LN == \r\n
Hoffe diese Antwort hilft.
Ich habe dieses Problem gerade bei der Ausgabe auf einem Windows-Client festgestellt. Sicher, PHP_EOL ist für die Serverseite, aber die meisten von PHP ausgegebenen Inhalte sind für Windows-Clients. Also muss ich meine Erkenntnisse hier für die nächste Person platzieren.
A) Echo 'Mein Text'. PHP_EOL; // Schlecht, da dies nur \ n ausgibt und die meisten Versionen des Windows-Notizblocks dies in einer einzelnen Zeile anzeigen und die meisten Windows-Buchhaltungssoftware diese Art von Zeilenendezeichen nicht importieren können.
B) Echo 'Mein Text \ r \ n'; // Schlecht, weil einfach zitierte PHP-Strings \ r \ n nicht interpretieren
C) Echo "Mein Text \ r \ n"; // Ja, es funktioniert! Sieht im Editor korrekt aus und funktioniert beim Importieren der Datei in andere Windows-Software wie Windows Accounting und Windows Manufacturing Software.
Ich bevorzuge \ n \ r. Außerdem bin ich auf einem Windows-System und \ n funktioniert meiner Erfahrung nach einwandfrei.
Da PHP_EOL nicht mit regulären Ausdrücken funktioniert und dies die nützlichste Art ist, mit Text umzugehen, habe ich ihn wirklich nie benutzt oder musste.