ควรใช้PHP_EOL
เมื่อไร?
บางครั้งฉันเห็นสิ่งนี้ในตัวอย่างโค้ดของ PHP สิ่งนี้จัดการกับปัญหาปลายทางของ DOS / Mac / Unix หรือไม่
ควรใช้PHP_EOL
เมื่อไร?
บางครั้งฉันเห็นสิ่งนี้ในตัวอย่างโค้ดของ PHP สิ่งนี้จัดการกับปัญหาปลายทางของ DOS / Mac / Unix หรือไม่
คำตอบ:
ใช่PHP_EOL
ใช้เพื่อค้นหาอักขระขึ้นบรรทัดใหม่ในวิธีที่เข้ากันได้ข้ามแพลตฟอร์มดังนั้นจึงสามารถจัดการกับปัญหา DOS / Unix ได้
โปรดทราบว่าPHP_EOLแสดงถึงอักขระตัวสุดท้ายสำหรับระบบปัจจุบัน ตัวอย่างเช่นจะไม่พบ endline ของ Windows เมื่อดำเนินการในระบบที่เหมือนยูนิกซ์
PHP_EOL
สำหรับข้อมูลที่โพสต์จากแบบฟอร์ม
จากmain/php.h
PHP เวอร์ชัน 7.1.1 และเวอร์ชัน 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
อย่างที่คุณเห็นPHP_EOL
สามารถเป็นได้"\r\n"
(บนเซิร์ฟเวอร์ Windows) หรือ"\n"
(อย่างอื่น) สำหรับ PHP เวอร์ชันก่อนหน้า 5.4.0RC8 มีค่าที่สามที่เป็นไปได้สำหรับPHP_EOL
: "\r"
(บนเซิร์ฟเวอร์ MacOSX) มันเป็นความผิดและได้รับการแก้ไขใน 2012-03-01 มีข้อผิดพลาด 61193
ขณะที่คนอื่น ๆ บอกคุณแล้วคุณสามารถใช้PHP_EOL
ในการใด ๆ ของการส่งออก (ที่ใด ๆค่าเหล่านี้จะถูกต้อง - เช่น HTML, XML, บันทึก ... ) ที่คุณต้องการแบบครบวงจรการขึ้นบรรทัดใหม่ โปรดทราบว่าเป็นเซิร์ฟเวอร์ที่กำหนดค่าไม่ใช่ไคลเอ็นต์ ผู้เยี่ยมชม Windows ของคุณจะได้รับค่าจากเซิร์ฟเวอร์ Unix ของคุณซึ่งไม่สะดวกสำหรับพวกเขาในบางครั้ง
ฉันแค่ต้องการแสดงค่าที่เป็นไปได้ของPHP_EOL
การสำรองข้อมูลโดยแหล่ง PHP เนื่องจากยังไม่ได้แสดงที่นี่ ...
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"
ค้นหา.
คุณใช้PHP_EOL
เมื่อคุณต้องการบรรทัดใหม่และคุณต้องการข้ามแพลตฟอร์ม
นี่อาจเป็นเมื่อคุณกำลังเขียนไฟล์ไปยังระบบไฟล์ (บันทึกการส่งออกและอื่น ๆ )
คุณสามารถใช้มันหากคุณต้องการให้ HTML ที่สร้างขึ้นของคุณสามารถอ่านได้ ดังนั้นคุณอาจทำตามที่คุณมี<br />
PHP_EOL
คุณจะใช้มันหากคุณใช้ php เป็นสคริปต์จาก cron และคุณต้องการที่จะแสดงผลออกมาและจัดรูปแบบสำหรับหน้าจอ
คุณอาจใช้มันหากคุณสร้างอีเมลเพื่อส่งสิ่งที่จำเป็นต้องมีการจัดรูปแบบ
$header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
PHP_EOL
ไม่ควรใช้เพื่อแยกส่วนหัวอีเมล ตามคู่มือPHP Mailควรมีการแยกส่วนหัวพิเศษหลายรายการด้วย CRLF (\ r \ n)
PHP_EOL (สตริง) สัญลักษณ์ 'สิ้นสุดสาย' ที่ถูกต้องสำหรับแพลตฟอร์มนี้ มีให้ตั้งแต่ PHP 4.3.10 และ PHP 5.0.2
คุณสามารถใช้ค่าคงที่นี้เมื่อคุณอ่านหรือเขียนไฟล์ข้อความบนระบบไฟล์ของเซิร์ฟเวอร์
การสิ้นสุดของบรรทัดไม่สำคัญในกรณีส่วนใหญ่เนื่องจากซอฟต์แวร์ส่วนใหญ่สามารถจัดการไฟล์ข้อความได้ไม่ว่าจะมาจากที่ใดก็ตาม คุณควรจะสอดคล้องกับรหัสของคุณ
หากการจบบรรทัดมีความสำคัญให้ระบุการจบบรรทัดอย่างชัดเจนแทนที่จะใช้ค่าคงที่ ตัวอย่างเช่น:
\r\n
\r\n
เป็นตัวคั่นแถวฉันต้องการที่จะตอบคำถามที่ว่า "เมื่อไม่ใช้" เนื่องจากยังไม่ได้ครอบคลุมและสามารถจินตนาการได้ว่ามันถูกใช้อย่างสุ่มสี่สุ่มห้าและไม่มีใครสังเกตเห็นว่ามีปัญหาจนกว่าจะถึงตอนท้ายบรรทัด บางข้อขัดแย้งกับคำตอบที่มีอยู่บ้าง
หากการแสดงผลไปยังหน้าเว็บในรูปแบบ HTML โดยเฉพาะอย่างยิ่งในข้อความ<textarea>
, <pre>
หรือ<code>
คุณอาจเคยต้องการที่จะใช้และไม่ได้\n
PHP_EOL
เหตุผลก็คือในขณะที่รหัสอาจทำงานได้ดีในเซิร์ฟเวอร์เดียว - ซึ่งเกิดขึ้นเป็นแพลตฟอร์มคล้าย Unix - หากใช้งานบนโฮสต์ Windows (เช่นแพลตฟอร์ม Windows Azure) จากนั้นอาจเปลี่ยนวิธีแสดงหน้าเว็บในเบราว์เซอร์บางตัว (โดยเฉพาะ Internet Explorer - บางเวอร์ชันจะเห็นทั้ง \ n และ \ r)
ฉันไม่แน่ใจว่าปัญหานี้ยังคงเป็นปัญหาอยู่หรือไม่ตั้งแต่ IE6 หรือไม่ดังนั้นจึงอาจเป็นข้อสงสัยที่น่าสงสัย อาจมีกรณีอื่น ๆ (เช่น XHTML ที่เข้มงวด) ซึ่งการแสดงผล suddently \r
ในบางแพลตฟอร์มอาจทำให้เกิดปัญหากับผลลัพธ์และฉันแน่ใจว่ามีกรณีขอบอื่น ๆ เช่นนั้น
ดังที่มีคนกล่าวไว้แล้วคุณไม่ต้องการใช้เมื่อกลับมาที่ส่วนหัว HTTP เพราะพวกเขาควรติดตาม RFC บนแพลตฟอร์มใด ๆ
ฉันจะไม่ใช้มันเพื่ออะไรอย่างตัวคั่นในไฟล์ CSV (ตามที่มีคนแนะนำ) แพลตฟอร์มที่เซิร์ฟเวอร์กำลังทำงานอยู่ไม่ควรกำหนดจุดสิ้นสุดบรรทัดในไฟล์ที่สร้างขึ้นหรือที่ใช้แล้ว
ฉันพบ PHP_EOL มีประโยชน์มากสำหรับการจัดการไฟล์โดยเฉพาะอย่างยิ่งถ้าคุณกำลังเขียนเนื้อหาหลายบรรทัดลงในไฟล์
ตัวอย่างเช่นคุณมีสตริงยาวที่คุณต้องการแบ่งเป็นหลายบรรทัดในขณะที่เขียนเป็นไฟล์ธรรมดา การใช้ \ r \ n อาจใช้งานไม่ได้เพียงแค่ใส่ PHP_EOL ลงในสคริปต์ของคุณและผลลัพธ์ก็ยอดเยี่ยม
ลองดูตัวอย่างง่ายๆด้านล่างนี้:
<?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";
}
?>
ไม่ PHP_EOL ไม่สามารถจัดการกับปัญหาปลายสายได้เนื่องจากระบบที่คุณใช้ค่าคงที่นั้นไม่ใช่ระบบเดียวกับที่คุณส่งเอาต์พุตไป
ฉันจะไม่แนะนำให้ใช้ PHP_EOL เลย Unix / Linux ใช้ \ n, MacOS / OS X เปลี่ยนจาก \ r เป็น \ n ด้วยและในหลาย ๆ แอปพลิเคชัน Windows (โดยเฉพาะเบราว์เซอร์) สามารถแสดงผลได้อย่างถูกต้องเช่นกัน บน Windows มันเป็นเรื่องง่ายที่จะเปลี่ยนรหัสฝั่งไคลเอ็นต์ที่มีอยู่เพื่อใช้ \ n เท่านั้นและยังคงรักษาความเข้ากันได้แบบย้อนหลัง: เพียงแค่เปลี่ยนตัวคั่นสำหรับการตัดบรรทัดจาก \ r \ n เป็น \ n และตัดใน trim () เช่นฟังก์ชัน .
คำจำกัดความของ PHP_EOL คือมันให้อักขระบรรทัดใหม่ของระบบปฏิบัติการที่คุณใช้งานอยู่
ในทางปฏิบัติคุณแทบไม่ควรต้องการสิ่งนี้ พิจารณาบางกรณี:
เมื่อคุณแสดงผลไปยังเว็บจะไม่มีการประชุมใด ๆ ยกเว้นว่าคุณควรจะสอดคล้องกัน เนื่องจากเซิร์ฟเวอร์ส่วนใหญ่เป็น Unixy คุณจะต้องใช้ "\ n" ต่อไป
หากคุณกำลังส่งออกไปยังไฟล์ PHP_EOL อาจดูเหมือนเป็นความคิดที่ดี อย่างไรก็ตามคุณสามารถรับผลกระทบที่คล้ายกันได้โดยการขึ้นบรรทัดใหม่ตามตัวอักษรในไฟล์ของคุณและสิ่งนี้จะช่วยคุณได้หากคุณพยายามเรียกใช้ไฟล์ที่จัดรูปแบบ CRLF ใน Unix โดยไม่ต้องขึ้นบรรทัดใหม่ที่มีอยู่ ฉันสามารถพูดได้ว่าฉันชอบพฤติกรรมหลัง)
PHP_EOL นั้นยาวมากจนไม่คุ้มที่จะใช้
มีสถานที่หนึ่งที่ชัดเจนซึ่งมันอาจมีประโยชน์คือ: เมื่อคุณเขียนโค้ดที่ส่วนใหญ่ใช้สตริงคำพูดเดี่ยว สามารถพิสูจน์ได้ว่า:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
ศิลปะของมันคือการสอดคล้อง ปัญหาเกี่ยวกับการมิกซ์แอนด์แมตช์ '' และ "" คือเมื่อคุณได้รับสตริงที่ยาวคุณไม่ต้องการไปหาคำพูดที่คุณใช้
เช่นเดียวกับทุกสิ่งในชีวิตมันขึ้นอยู่กับบริบท
"newline" มาตรฐานของ DOS / Windows คือ CRLF (= \ r \ n) และไม่ใช่ LFCR (\ n \ r) หากเรานำสิ่งเหล่านี้กลับมามีแนวโน้มที่จะสร้างพฤติกรรมที่ไม่คาดคิด (ในความเป็นจริงแล้วเป็นประเภทที่คาดหวัง!: D)
ปัจจุบันโปรแกรมเกือบทั้งหมด (เขียนดี) ยอมรับ LF มาตรฐานของ UNIX สำหรับ \ (\ n) สำหรับโค้ดขึ้นบรรทัดใหม่แม้แต่ mail sender daemons (RFC ตั้ง CRLF เป็นบรรทัดใหม่สำหรับส่วนหัวและเนื้อหาข้อความ)
มีประโยชน์กับ error_log () หากคุณกำลังแสดงผลหลายบรรทัด
ฉันได้พบคำสั่ง debug จำนวนมากดูแปลก ๆ บน windows ของฉันติดตั้งเนื่องจากผู้พัฒนาสันนิษฐานว่ายูนิกซ์สิ้นสุดเมื่อเลิกสตริง
ฉันใช้ค่าคงที่ PHP_EOL ในสคริปต์บรรทัดคำสั่งที่ฉันต้องเขียน ฉันพัฒนาบนเครื่อง Windows ของฉันในท้องถิ่นแล้วทดสอบบนกล่องเซิร์ฟเวอร์ Linux การใช้ค่าคงที่หมายความว่าฉันไม่ต้องกังวลเกี่ยวกับการใช้บรรทัดที่ถูกต้องสำหรับแต่ละแพลตฟอร์ม
ฉันมีเว็บไซต์ที่สคริปต์การบันทึกเขียนบรรทัดใหม่ของข้อความไปยังไฟล์ข้อความหลังจากการกระทำจากผู้ใช้ที่สามารถใช้ระบบปฏิบัติการใด ๆ
การใช้ PHP_EOL ดูเหมือนจะไม่เหมาะสมที่สุดในกรณีนี้ หากผู้ใช้อยู่บน Mac OS และเขียนไปยัง textfile มันจะใส่ \ n เมื่อเปิดไฟล์ข้อความบนคอมพิวเตอร์ที่ใช้ windows จะไม่แสดงตัวแบ่งบรรทัด ด้วยเหตุนี้ฉันจึงใช้ "\ r \ n" แทนซึ่งจะทำงานเมื่อเปิดไฟล์บนระบบปฏิบัติการใด ๆ
คุณกำลังเขียนโค้ดที่ใช้สตริงคำพูดเดี่ยว ๆ เป็นส่วนใหญ่
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
ฉันใช้ WebCalendar และพบว่า Mac iCal barfs ในการนำเข้าไฟล์ ics ที่สร้างขึ้นเนื่องจากจุดสิ้นสุดของบรรทัดถูก hardcoded ใน xcal.php เป็น "\ r \ n" ฉันเข้ามาแทนที่เหตุการณ์ทั้งหมดด้วย PHP_EOL และตอนนี้ iCal มีความสุข! ฉันยังทดสอบใน Vista และ Outlook ก็สามารถนำเข้าไฟล์ได้เช่นกันแม้ว่าตัวอักขระสุดท้ายของบรรทัดคือ "\ n"
\n
ให้ใช้สิ่งนั้นอย่างชัดเจน
เมื่อ jumi (ปลั๊กอิน Joomla สำหรับ PHP) รวบรวมรหัสของคุณด้วยเหตุผลบางประการมันจะลบแบ็กสแลชทั้งหมดออกจากโค้ดของคุณ เช่นว่าสิ่งที่ชอบ$csv_output .= "\n";
จะกลายเป็น$csv_output .= "n";
บั๊กที่น่ารำคาญมาก!
ใช้ PHP_EOL แทนเพื่อให้ได้ผลลัพธ์ตามที่คุณต้องการ
ในบางระบบอาจมีประโยชน์ในการใช้ค่าคงที่นี้เพราะถ้าเช่นคุณกำลังส่งอีเมลคุณสามารถใช้ PHP_EOL เพื่อให้สคริปต์ข้ามระบบทำงานกับระบบมากขึ้น ... แต่ถึงแม้ว่ามันจะมีประโยชน์ในบางครั้งคุณสามารถหาสิ่งนี้ได้ ค่าคงที่ไม่ได้กำหนดโฮสติ้งทันสมัยพร้อมเอ็นจิ้น php ล่าสุดไม่มีปัญหานี้ แต่ฉันคิดว่าสิ่งที่ดีคือการเขียนรหัสบิตที่ช่วยประหยัดสถานการณ์นี้:
<?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");
}
}
?>
ดังนั้นคุณสามารถใช้ PHP_EOL ได้โดยไม่มีปัญหา ... เห็นได้ชัดว่าควรใช้ PHP_EOL กับสคริปต์ที่ควรทำงานกับระบบมากขึ้นในครั้งเดียวมิฉะนั้นคุณสามารถใช้ \ n หรือ \ r หรือ \ r \ n ...
หมายเหตุ: PHP_EOL สามารถเป็นได้
1) on Unix LN == \n
2) on Mac CR == \r
3) on Windows CR+LN == \r\n
หวังว่าคำตอบนี้จะช่วยได้
ฉันเพิ่งพบปัญหานี้เมื่อส่งออกไปยังไคลเอนต์ Windows แน่นอนว่า PHP_EOL นั้นสำหรับฝั่งเซิร์ฟเวอร์ แต่เนื้อหาส่วนใหญ่ที่ส่งออกจาก php นั้นสำหรับไคลเอนต์ของ windows ดังนั้นฉันต้องทำการค้นพบของฉันที่นี่สำหรับคนต่อไป
A) echo 'My Text' PHP_EOL; // ไม่ดีเพราะนี่เป็นเพียงผลลัพธ์ \ n และเวอร์ชัน notepad ของ windows ส่วนใหญ่จะแสดงสิ่งนี้ในบรรทัดเดียวและซอฟต์แวร์บัญชี windows ส่วนใหญ่ไม่สามารถนำเข้าอักขระตัวอักษรปลายเส้นประเภทนี้ได้
B) echo 'My Text \ r \ n'; // ไม่ดีเนื่องจากสตริง php ที่ยกมาเดี่ยวไม่ตีความ \ r \ n
C) echo "ข้อความของฉัน \ r \ n"; // Yay มันใช้งานได้! ดูถูกต้องใน notepad และทำงานเมื่อนำเข้าไฟล์ไปยังซอฟต์แวร์ windows อื่น ๆ เช่นบัญชี windows และซอฟต์แวร์การผลิต windows
ฉันชอบที่จะใช้ \ n \ r นอกจากนี้ฉันอยู่บนระบบ windows และ \ n ทำงานได้ดีในประสบการณ์ของฉัน
เนื่องจาก PHP_EOL ไม่ทำงานกับนิพจน์ทั่วไปและนี่เป็นวิธีที่มีประโยชน์ที่สุดในการจัดการกับข้อความดังนั้นฉันจึงไม่เคยใช้มันหรือจำเป็นต้องใช้