Kapan ide yang bagus untuk digunakan PHP_EOL
?
Terkadang saya melihat ini dalam contoh kode PHP. Apakah ini menangani masalah endline DOS / Mac / Unix?
Kapan ide yang bagus untuk digunakan PHP_EOL
?
Terkadang saya melihat ini dalam contoh kode PHP. Apakah ini menangani masalah endline DOS / Mac / Unix?
Jawaban:
Ya, PHP_EOL
seolah-olah digunakan untuk menemukan karakter baris baru dengan cara yang kompatibel lintas platform, sehingga menangani masalah DOS / Unix.
Perhatikan bahwa PHP_EOL mewakili karakter endline untuk sistem saat ini. Sebagai contoh, itu tidak akan menemukan endline Windows ketika dijalankan pada sistem seperti unix.
PHP_EOL
untuk data yang diposting dari formulir.
Dari main/php.h
PHP versi 7.1.1 dan versi 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
Seperti yang Anda lihat PHP_EOL
bisa "\r\n"
(pada server Windows) atau "\n"
(pada apa pun). Pada versi PHP sebelum 5.4.0RC8, ada nilai ketiga yang mungkin untuk PHP_EOL
: "\r"
(pada server MacOSX). Itu salah dan telah diperbaiki pada 2012-03-01 dengan bug 61193 .
Seperti orang lain sudah bilang, Anda dapat menggunakan PHP_EOL
dalam setiap jenis keluaran (di mana setiap nilai-nilai ini berlaku - seperti: HTML, XML, log ...) di mana Anda ingin bersatu baris . Perlu diingat bahwa serverlah yang menentukan nilai, bukan klien. Pengunjung Windows Anda akan mendapatkan nilai dari server Unix Anda yang kadang tidak nyaman bagi mereka.
Saya hanya ingin menunjukkan nilai-nilai yang mungkin PHP_EOL
didukung oleh sumber PHP karena belum ditampilkan di sini ...
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"
untuk mencari tahu.
Anda menggunakan PHP_EOL
ketika Anda ingin baris baru, dan Anda ingin menjadi cross-platform.
Ini bisa terjadi ketika Anda menulis file ke sistem file (log, ekspor, lainnya).
Anda dapat menggunakannya jika Anda ingin HTML yang dihasilkan dapat dibaca. Jadi, Anda dapat mengikuti Anda <br />
dengan PHP_EOL
.
Anda akan menggunakannya jika Anda menjalankan php sebagai skrip dari cron dan Anda perlu menampilkan sesuatu dan memformatnya untuk layar.
Anda mungkin menggunakannya jika Anda membangun email untuk mengirim yang memerlukan beberapa format.
$header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
PHP_EOL
tidak boleh digunakan untuk memisahkan header email. Menurut manual PHP Mail , beberapa header tambahan harus dipisahkan dengan CRLF (\ r \ n).
PHP_EOL (string) Simbol 'End Of Line' yang benar untuk platform ini. Tersedia sejak PHP 4.3.10 dan PHP 5.0.2
Anda dapat menggunakan konstanta ini ketika Anda membaca atau menulis file teks pada sistem file server.
Akhir baris tidak penting dalam banyak kasus karena sebagian besar perangkat lunak mampu menangani file teks terlepas dari asalnya. Anda harus konsisten dengan kode Anda.
Jika akhir baris penting, tentukan secara eksplisit akhir baris alih-alih menggunakan konstanta. Sebagai contoh:
\r\n
\r\n
sebagai pemisah barisSaya ingin memberikan jawaban yang membahas "Kapan tidak menggunakannya" karena belum dibahas dan dapat membayangkan itu digunakan secara membabi buta dan tidak ada yang memperhatikan ada masalah sampai nanti. Sebagian dari ini agak bertentangan dengan beberapa jawaban yang ada.
Jika mengeluarkan ke halaman web dalam HTML, khususnya teks dalam <textarea>
, <pre>
atau <code>
Anda mungkin selalu ingin menggunakannya \n
dan tidak PHP_EOL
.
Alasan untuk ini adalah bahwa sementara kode dapat berfungsi dengan baik pada satu server - yang kebetulan merupakan platform seperti Unix - jika digunakan pada host Windows (seperti platform Windows Azure) maka itu dapat mengubah cara halaman ditampilkan di beberapa browser (khusus Internet Explorer - beberapa versi yang akan melihat \ n dan \ r).
Saya tidak yakin apakah ini masih menjadi masalah sejak IE6 atau tidak, jadi mungkin cukup diperdebatkan tetapi tampaknya layak disebutkan jika itu membantu orang-orang meminta untuk memikirkan konteksnya. Mungkin ada kasus lain (seperti XHTML ketat) di mana tiba-tiba keluaran \r
pada beberapa platform dapat menyebabkan masalah dengan output, dan saya yakin ada kasus tepi lainnya seperti itu.
Seperti yang sudah dicatat oleh seseorang, Anda tidak ingin menggunakannya saat mengembalikan header HTTP - karena mereka harus selalu mengikuti RFC di platform apa pun.
Saya tidak akan menggunakannya untuk sesuatu seperti pembatas pada file CSV (seperti yang disarankan seseorang). Platform yang dijalankan memutuskan tidak seharusnya menentukan akhir baris dalam file yang dihasilkan atau dikonsumsi.
Saya menemukan PHP_EOL sangat berguna untuk penanganan file, khususnya jika Anda menulis beberapa baris konten ke dalam file.
Misalnya, Anda memiliki string panjang yang ingin dipecah menjadi beberapa baris saat menulis ke file biasa. Menggunakan \ r \ n mungkin tidak berfungsi, cukup masukkan PHP_EOL ke skrip Anda dan hasilnya mengagumkan.
Lihatlah contoh sederhana di bawah ini:
<?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";
}
?>
Tidak, PHP_EOL tidak menangani masalah endline, karena sistem tempat Anda menggunakan konstanta itu bukanlah sistem yang sama dengan tempat Anda mengirim output.
Saya tidak akan merekomendasikan menggunakan PHP_EOL sama sekali. Penggunaan Unix / Linux \ n, MacOS / OS X juga berubah dari \ r ke \ n dan pada Windows banyak aplikasi (terutama browser) dapat menampilkannya dengan benar juga. Di Windows, juga mudah mengubah kode sisi klien yang ada untuk hanya menggunakan \ n dan masih mempertahankan kompatibilitas ke belakang: Cukup ubah pembatas untuk pemangkasan garis dari \ r \ n ke \ n dan bungkus dalam fungsi seperti trim () seperti .
Definisi PHP_EOL adalah memberi Anda karakter baris baru dari sistem operasi yang sedang Anda kerjakan.
Dalam praktiknya, Anda seharusnya hampir tidak pernah membutuhkan ini. Pertimbangkan beberapa kasus:
Ketika Anda mengeluarkan ke web, sebenarnya tidak ada konvensi apa pun kecuali bahwa Anda harus konsisten. Karena sebagian besar server adalah Unixy, Anda tetap ingin menggunakan "\ n".
Jika Anda mengunggah ke file, PHP_EOL mungkin tampak seperti ide yang bagus. Namun, Anda bisa mendapatkan efek serupa dengan memiliki baris baru literal di dalam file Anda, dan ini akan membantu Anda jika Anda mencoba menjalankan beberapa file yang diformat CRLF di Unix tanpa mengganggu baris baru yang ada (sebagai seorang pria dengan sistem dual-boot , Saya dapat mengatakan bahwa saya lebih suka perilaku yang terakhir)
PHP_EOL sangat panjang sehingga benar-benar tidak layak menggunakannya.
Ada satu tempat yang jelas di mana itu mungkin berguna: ketika Anda menulis kode yang sebagian besar menggunakan string kutipan tunggal. Dapat diperdebatkan apakah:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Seni itu harus konsisten. Masalahnya dengan mencampur dan mencocokkan '' dan "" adalah ketika Anda mendapatkan string yang panjang, Anda tidak benar-benar ingin pergi mencari jenis kutipan yang Anda gunakan.
Seperti halnya semua hal dalam hidup, itu tergantung pada konteksnya.
"Newline" standar DOS / Windows adalah CRLF (= \ r \ n) dan bukan LFCR (\ n \ r). Jika kita menempatkan yang terakhir, kemungkinan akan menghasilkan beberapa perilaku tak terduga (yah, pada kenyataannya, jenis yang diharapkan!: D).
Saat ini hampir semua program (ditulis dengan baik) menerima LF (\ n) standar UNIX untuk kode baris baru, bahkan daemon pengirim surat (RFC menetapkan CRLF sebagai baris baru untuk header dan badan pesan).
Berguna dengan error_log () jika Anda menghasilkan banyak baris.
Saya telah menemukan banyak pernyataan debug terlihat aneh pada instalasi windows saya karena para pengembang telah mengasumsikan akhir unix ketika putus string.
Saya menggunakan konstanta PHP_EOL dalam beberapa skrip baris perintah yang harus saya tulis. Saya mengembangkan pada mesin Windows lokal saya dan kemudian menguji pada kotak server Linux. Menggunakan konstanta berarti saya tidak perlu khawatir tentang penggunaan garis akhir yang benar untuk masing-masing platform yang berbeda.
Saya memiliki situs tempat skrip logging menulis baris teks baru ke file teks setelah tindakan dari pengguna, yang dapat menggunakan OS apa pun.
Menggunakan PHP_EOL tampaknya tidak optimal dalam hal ini. Jika pengguna menggunakan Mac OS dan menulis ke file teks itu akan meletakkan \ n. Ketika membuka file teks di komputer windows itu tidak menunjukkan jeda baris. Untuk alasan ini saya menggunakan "\ r \ n" sebagai gantinya yang berfungsi saat membuka file pada OS apa pun.
Anda menulis kode yang sebagian besar menggunakan string kutipan tunggal.
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Saya menggunakan WebCalendar dan menemukan bahwa Mac iCal barfs pada mengimpor file ics yang dihasilkan karena end-of-line hardcoded dalam xcal.php sebagai "\ r \ n". Saya masuk dan mengganti semua kejadian dengan PHP_EOL dan sekarang iCal senang! Saya juga mengujinya di Vista dan Outlook dapat mengimpor file juga, meskipun karakter garis akhir adalah "\ n".
\n
, gunakan itu secara eksplisit.
Ketika jumi (plugin joomla untuk PHP) mengkompilasi kode Anda karena suatu alasan ia menghapus semua garis miring terbalik dari kode Anda. Seperti itulah sesuatu $csv_output .= "\n";
menjadi$csv_output .= "n";
Bug yang sangat menjengkelkan!
Gunakan PHP_EOL sebagai gantinya untuk mendapatkan hasil yang Anda cari.
Pada beberapa sistem mungkin berguna untuk menggunakan konstanta ini karena jika, misalnya, Anda mengirim email, Anda dapat menggunakan PHP_EOL untuk membuat skrip lintas-sistem bekerja pada lebih banyak sistem ... tetapi bahkan jika berguna kadang-kadang Anda dapat menemukan ini konstan undefined, hosting modern dengan mesin php terbaru tidak memiliki masalah ini, tetapi saya berpikir bahwa hal yang baik adalah menulis kode bit yang menyelamatkan situasi ini:
<?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");
}
}
?>
Jadi Anda dapat menggunakan PHP_EOL tanpa masalah ... jelas bahwa PHP_EOL harus digunakan pada skrip yang seharusnya bekerja pada lebih banyak sistem sekaligus jika tidak, Anda dapat menggunakan \ n atau \ r atau \ r \ n ...
Catatan: PHP_EOL bisa
1) on Unix LN == \n
2) on Mac CR == \r
3) on Windows CR+LN == \r\n
Semoga jawaban ini membantu.
Saya baru saja mengalami masalah ini ketika mengeluarkan ke klien Windows. Tentu, PHP_EOL untuk sisi server, tetapi sebagian besar konten output dari php adalah untuk klien windows. Jadi saya harus meletakkan temuan saya di sini untuk orang berikutnya.
A) gema 'Teks Saya'. PHP_EOL; // Buruk karena ini hanya menghasilkan \ n dan sebagian besar versi Windows Notepad menampilkan ini pada satu baris, dan sebagian besar perangkat lunak akuntansi windows tidak dapat mengimpor jenis karakter end of line ini.
B) gema 'Teks Saya \ r \ n'; // Buruk karena string php tunggal yang dikutip tidak menafsirkan \ r \ n
C) echo "Teks Saya \ r \ n"; // Yay berhasil! Terlihat benar di notepad, dan berfungsi saat mengimpor file ke perangkat lunak windows lain seperti windows accounting dan windows manufacturing software.
Saya lebih suka menggunakan \ n \ r. Saya juga menggunakan sistem windows dan \ n bekerja dengan baik dalam pengalaman saya.
Karena PHP_EOL tidak berfungsi dengan ekspresi reguler, dan ini adalah cara yang paling berguna untuk berurusan dengan teks, maka saya benar-benar tidak pernah menggunakannya atau perlu melakukannya.