Khi nào nó là một ý tưởng tốt để sử dụng PHP_EOL
?
Đôi khi tôi thấy điều này trong các mẫu mã của PHP. Điều này có xử lý các vấn đề về endline của DOS / Mac / Unix không?
Khi nào nó là một ý tưởng tốt để sử dụng PHP_EOL
?
Đôi khi tôi thấy điều này trong các mẫu mã của PHP. Điều này có xử lý các vấn đề về endline của DOS / Mac / Unix không?
Câu trả lời:
Có, PHP_EOL
dường như được sử dụng để tìm ký tự dòng mới theo cách tương thích đa nền tảng, do đó, nó xử lý các vấn đề về DOS / Unix.
Lưu ý rằng PHP_EOL đại diện cho ký tự endline cho hệ thống hiện tại . Chẳng hạn, nó sẽ không tìm thấy một dòng cuối Windows khi được thực thi trên một hệ thống giống như unix.
PHP_EOL
cho dữ liệu được đăng từ mẫu.
Từ main/php.h
phiên bản PHP 7.1.1 và phiên bản 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
Như bạn thấy PHP_EOL
có thể là "\r\n"
(trên các máy chủ Windows) hoặc "\n"
(trên bất cứ thứ gì khác). Trên các phiên bản PHP trước 5.4.0RC8, có một giá trị thứ ba có thể có cho PHP_EOL
: "\r"
(trên các máy chủ MacOSX). Nó đã sai và đã được sửa vào ngày 2012 / 03-01 với lỗi 61193 .
Như những người khác đã nói với bạn, bạn có thể sử dụng PHP_EOL
trong bất kỳ loại đầu ra nào (trong đó bất kỳ giá trị nào trong số này là hợp lệ - như: HTML, XML, nhật ký ...) trong đó bạn muốn các dòng mới thống nhất . Hãy nhớ rằng đó là máy chủ xác định giá trị chứ không phải máy khách. Khách truy cập Windows của bạn sẽ nhận được giá trị từ máy chủ Unix của bạn đôi khi gây bất tiện cho họ.
Tôi chỉ muốn hiển thị các giá trị sở hữu được PHP_EOL
hỗ trợ bởi các nguồn PHP vì nó chưa được hiển thị ở đây ...
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"
tim ra.
Bạn sử dụng PHP_EOL
khi bạn muốn một dòng mới và bạn muốn trở thành nền tảng chéo.
Điều này có thể là khi bạn đang ghi tập tin vào hệ thống tập tin (nhật ký, xuất, khác).
Bạn có thể sử dụng nó nếu bạn muốn HTML được tạo của mình có thể đọc được. Vì vậy, bạn có thể làm theo của bạn <br />
với a PHP_EOL
.
Bạn sẽ sử dụng nó nếu bạn đang chạy php dưới dạng tập lệnh từ cron và bạn cần xuất ra một cái gì đó và để nó được định dạng cho màn hình.
Bạn có thể sử dụng nó nếu bạn đang xây dựng một email để gửi một số định dạng cần thiết.
$header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
PHP_EOL
không nên được sử dụng để phân tách các tiêu đề email. Theo hướng dẫn sử dụng PHP Mail , nhiều tiêu đề bổ sung phải được phân tách bằng CRLF (\ r \ n).
PHP_EOL (chuỗi) Biểu tượng 'End Of Line' chính xác cho nền tảng này. Có sẵn kể từ PHP 4.3.10 và PHP 5.0.2
Bạn có thể sử dụng hằng số này khi bạn đọc hoặc ghi tệp văn bản trên hệ thống tệp của máy chủ.
Kết thúc dòng không quan trọng trong hầu hết các trường hợp vì hầu hết các phần mềm có khả năng xử lý các tệp văn bản bất kể nguồn gốc của chúng. Bạn nên phù hợp với mã của bạn.
Nếu kết thúc dòng quan trọng, chỉ định rõ ràng kết thúc dòng thay vì sử dụng hằng. Ví dụ:
\r\n
\r\n
làm dấu tách hàngTôi muốn đưa ra một câu trả lời có nội dung "Khi nào không sử dụng nó" vì nó chưa được bảo hiểm và có thể tưởng tượng nó được sử dụng một cách mù quáng và không ai nhận thấy có vấn đề gì cho đến tận cuối dòng. Một số điều này mâu thuẫn với một số câu trả lời hiện có phần nào.
Nếu xuất ra đến một trang web dưới dạng HTML, đặc biệt là văn bản trong <textarea>
, <pre>
hoặc <code>
bạn có thể luôn luôn muốn sử dụng \n
và không PHP_EOL
.
Lý do cho điều này là vì mã có thể hoạt động tốt trên một sever - đó là một nền tảng giống Unix - nếu được triển khai trên máy chủ Windows (như nền tảng Windows Azure) thì nó có thể thay đổi cách hiển thị các trang trong một số trình duyệt (cụ thể là Internet Explorer - một số phiên bản sẽ thấy cả \ n và \ r).
Tôi không chắc liệu đây có còn là vấn đề kể từ IE6 hay không, vì vậy nó có thể khá khó khăn nhưng có vẻ đáng nói nếu nó giúp mọi người nhanh chóng nghĩ về bối cảnh. Có thể có các trường hợp khác (chẳng hạn như XHTML nghiêm ngặt) khi việc xuất hoàn toàn \r
trên một số nền tảng có thể gây ra sự cố với đầu ra và tôi chắc chắn có những trường hợp khác như thế.
Như đã được lưu ý bởi ai đó, bạn sẽ không muốn sử dụng nó khi trả về các tiêu đề HTTP - vì họ phải luôn theo dõi RFC trên bất kỳ nền tảng nào.
Tôi sẽ không sử dụng nó cho một cái gì đó như dấu phân cách trên các tệp CSV (như ai đó đã đề xuất). Nền tảng mà sever đang chạy không nên xác định các kết thúc dòng trong các tệp được tạo hoặc tiêu thụ.
Tôi thấy PHP_EOL rất hữu ích để xử lý tệp, đặc biệt nếu bạn đang viết nhiều dòng nội dung vào một tệp.
Ví dụ: bạn có một chuỗi dài mà bạn muốn chia thành nhiều dòng trong khi viết vào tệp đơn giản. Sử dụng \ r \ n có thể không hoạt động nên chỉ cần đưa PHP_EOL vào tập lệnh của bạn và kết quả thật tuyệt vời.
Kiểm tra ví dụ đơn giản dưới đây:
<?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";
}
?>
Không, PHP_EOL không xử lý các sự cố nội tuyến, bởi vì hệ thống mà bạn sử dụng hằng số đó không giống với hệ thống mà bạn gửi đầu ra.
Tôi không khuyên bạn nên sử dụng PHP_EOL cả. Unix / Linux sử dụng \ n, MacOS / OS X cũng thay đổi từ \ r thành \ n và trên Windows, nhiều ứng dụng (đặc biệt là trình duyệt) cũng có thể hiển thị chính xác. Trên Windows, bạn cũng dễ dàng thay đổi mã phía máy khách hiện tại để chỉ sử dụng \ n và vẫn duy trì khả năng tương thích ngược: Chỉ cần thay đổi dấu phân cách để cắt xén dòng từ \ r \ n thành \ n và bọc nó trong một chức năng như trim () .
Định nghĩa của PHP_EOL là nó cung cấp cho bạn ký tự dòng mới của hệ điều hành bạn đang làm việc.
Trong thực tế, bạn gần như không bao giờ cần điều này. Hãy xem xét một vài trường hợp:
Khi bạn xuất ra web, thực sự không có bất kỳ quy ước nào ngoại trừ việc bạn nên nhất quán. Vì hầu hết các máy chủ đều là Unixy, nên bạn sẽ muốn sử dụng "\ n".
Nếu bạn xuất ra một tệp, PHP_EOL có vẻ như là một ý tưởng tốt. Tuy nhiên, bạn có thể có được hiệu ứng tương tự bằng cách có một dòng mới theo nghĩa đen trong tệp của mình và điều này sẽ giúp bạn biết nếu bạn đang cố chạy một số tệp được định dạng CRLF trên Unix mà không ghi đè các dòng mới hiện có (như một anh chàng có hệ thống khởi động kép , Tôi có thể nói rằng tôi thích hành vi sau)
PHP_EOL dài đến mức nực cười đến nỗi nó thực sự không đáng để sử dụng nó.
Có một nơi rõ ràng có thể hữu ích: khi bạn đang viết mã chủ yếu sử dụng các chuỗi trích dẫn. Nó được tranh luận là liệu:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Nghệ thuật của nó là phải nhất quán. Vấn đề với sự pha trộn và kết hợp '' và "" là khi bạn nhận được chuỗi dài, bạn không thực sự muốn đi săn tìm loại trích dẫn nào bạn đã sử dụng.
Như với tất cả mọi thứ trong cuộc sống, nó phụ thuộc vào bối cảnh.
"Dòng mới" của DOS / Windows là CRLF (= \ r \ n) chứ không phải LFCR (\ n \ r). Nếu chúng ta đặt cái sau, nó có khả năng tạo ra một số hành vi bất ngờ (tốt, trên thực tế, loại dự kiến !: D).
Ngày nay, hầu hết tất cả các chương trình (được viết tốt) đều chấp nhận tiêu chuẩn UNIX (\ n) cho mã dòng mới, thậm chí cả trình nền của người gửi thư (RFC đặt CRLF làm dòng mới cho tiêu đề và nội dung thư).
Tiện dụng với error_log () nếu bạn xuất ra nhiều dòng.
Tôi đã tìm thấy rất nhiều câu lệnh gỡ lỗi trông lạ khi cài đặt windows của tôi vì các nhà phát triển đã giả sử các kết thúc unix khi chia chuỗi.
Tôi có một trang web nơi tập lệnh ghi nhật ký ghi một dòng văn bản mới vào tệp văn bản sau một hành động từ người dùng, người có thể đang sử dụng bất kỳ HĐH nào.
Sử dụng PHP_EOL dường như không phải là tối ưu trong trường hợp này. Nếu người dùng ở trên Mac OS và ghi vào tệp văn bản, nó sẽ đặt \ n. Khi mở tệp văn bản trên máy tính windows, nó không hiển thị ngắt dòng. Vì lý do này, tôi sử dụng "\ r \ n" thay vì hoạt động khi mở tệp trên bất kỳ HĐH nào.
Bạn đang viết mã chủ yếu sử dụng các chuỗi trích dẫn.
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Tôi đang sử dụng WebCalWiki và thấy rằng Mac iCal barfs khi nhập tệp ics được tạo bởi vì dòng cuối được mã hóa cứng trong xcal.php là "\ r \ n". Tôi đã đi vào và thay thế tất cả các lần xuất hiện với PHP_EOL và bây giờ iCal rất vui! Tôi cũng đã thử nghiệm nó trên Vista và Outlook cũng có thể nhập tệp, mặc dù cuối dòng ký tự là "\ n".
\n
, sử dụng rõ ràng.
Khi jumi (plugin j Joomla cho PHP) biên dịch mã của bạn vì một số lý do, nó sẽ xóa tất cả các dấu gạch chéo ngược khỏi mã của bạn. Như vậy một cái gì đó như $csv_output .= "\n";
trở thành$csv_output .= "n";
Lỗi rất khó chịu!
Sử dụng PHP_EOL thay vào đó để có được kết quả mà bạn đạt được sau đó.
Trên một số hệ thống có thể hữu ích để sử dụng hằng số này bởi vì, ví dụ, nếu bạn đang gửi email, bạn có thể sử dụng PHP_EOL để có một tập lệnh hệ thống chéo hoạt động trên nhiều hệ thống hơn ... nhưng ngay cả khi đôi khi nó hữu ích, bạn có thể tìm thấy liên tục không xác định, lưu trữ hiện đại với công cụ php mới nhất không gặp phải vấn đề này nhưng tôi nghĩ rằng một điều tốt là viết một mã bit để cứu tình huống này:
<?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");
}
}
?>
Vì vậy, bạn có thể sử dụng PHP_EOL mà không gặp vấn đề gì ... rõ ràng rằng PHP_EOL nên được sử dụng trên tập lệnh nên hoạt động trên nhiều hệ thống cùng một lúc nếu không bạn có thể sử dụng \ n hoặc \ r hoặc \ r \ n ...
Lưu ý: PHP_EOL có thể
1) on Unix LN == \n
2) on Mac CR == \r
3) on Windows CR+LN == \r\n
Mong câu trả lời này có ích.
Tôi vừa gặp vấn đề này khi xuất ra máy khách Windows. Chắc chắn, PHP_EOL dành cho phía máy chủ, nhưng hầu hết đầu ra nội dung từ php là dành cho máy khách windows. Vì vậy, tôi phải đặt những phát hiện của tôi ở đây cho người tiếp theo.
A) tiếng vang 'Văn bản của tôi'. PHP_EOL; // Xấu vì điều này chỉ xuất ra \ n và hầu hết các phiên bản windows notepad hiển thị điều này trên một dòng và hầu hết các phần mềm kế toán windows không thể nhập loại ký tự cuối dòng này.
B) echo 'Văn bản của tôi \ r \ n'; // Xấu vì các chuỗi php trích dẫn đơn không diễn giải \ r \ n
C) lặp lại "Văn bản của tôi \ r \ n"; // Yay nó hoạt động! Nhìn chính xác trong notepad và hoạt động khi nhập tệp vào các phần mềm windows khác như phần mềm kế toán windows và phần mềm sản xuất windows.
Tôi thích sử dụng \ n \ r. Ngoài ra tôi đang ở trên một hệ thống cửa sổ và \ n hoạt động tốt theo kinh nghiệm của tôi.
Vì PHP_EOL không hoạt động với các biểu thức thông thường và đây là cách xử lý văn bản hữu ích nhất, nên tôi thực sự không bao giờ sử dụng nó hoặc cần thiết.