Когда лучше всего использовать PHP_EOL?
Иногда я вижу ее в примерах кода PHP. Решает ли это проблемы завершения строки в системах DOS/Mac/Unix?
Ответ 1
Да, PHP_EOL якобы используется для поиска символа новой строки кроссплатформенным способом, поэтому это решает проблемы в DOS/Unix.
Обратите внимание, что PHP_EOL представляет собой символ конца строки для текущей системы. Например, он не найдет конечную строку Windows при выполнении в unix-подобной системе.
Ответ 2
Начиная 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). Это было неправильно и было исправлено 01.03.2012 с ошибкой 61193.
Вы можете использовать PHP_EOL в любом виде вывода (где допустимы любые из этих значений - например, HTML, XML, журналы ...), где вы хотите использовать унифицированные символы новой строки. Имейте в виду, что значение определяет сервер, а не клиент. Пользователи Windows будут получать выгоду от вашего сервера Unix, что иногда для них неудобно.
Ответ 3
Вы используете PHP_EOL, когда вам нужна новая строка и вы хотите использовать кроссплатформенный подход. Это можно применять при записи файлов в файловую систему (журналы, экспорт и другие). Вы можете использовать это, если хотите, чтобы сгенерированный вами HTML был читабельным. Поэтому вы можете сопровождать ваш <br /> символом PHP_EOL. Также это можно использовать, если вы запускаете php как скрипт из cron и вам нужно вывести что-то и отформатировать это для экрана. Или, если вы создаете письмо для отправки, которое нуждается в форматировании.
Ответ 4
Я бы хотел добавить ответ на вопрос «Когда не следует его использовать», поскольку он еще не рассматривался, и я могу представить, что он используется вслепую, и никто не замечает проблемы до тех пор, пока не появится проблема. Некоторые из этих вопросов несколько противоречат некоторым существующим ответам.
При выводе на веб-страницу в HTML, особенно текста в <textarea>, <pre> или <code>, вы, вероятно, всегда захотите использовать \n, а не PHP_EOL.
Причина этого в том, что хотя код может хорошо работать на одном сервере – который является Unix-подобной платформой – при развертывании на хосте Windows (например, на платформе Windows Azure) он может изменить отображение страниц в некоторых браузерах (в частности, в Internet Explorer, некоторые версии которого будут видеть и \n, и \r).
Я не уверен, осталась ли эта проблема со времен IE6 или нет, так что это может быть довольно спорным, но, считаю необходимым предупредить, если это поможет людям задуматься о контексте. Могут быть и другие случаи (например, строгий XHTML), когда вывод \r' на некоторых платформах может вызвать проблемы с выводом, и я уверен, что есть и другие подобные случаи. Как уже было отмечено, вы не захотите использовать его при возврате HTTP-заголовков, поскольку они всегда должны соответствовать RFC на любой платформе.
Я бы не стал использовать его для чего-то вроде разделителей в CSV-файлах. Платформа, на которой работает сервер, не должна определять окончания строк в генерируемых или потребляемых файлах.
Ответ 5
Я нашел PHP_EOL очень полезным для работы с файлами, особенно если вы записываете в файл несколько строк содержимого. Например, у вас есть длинная строка, которую вы хотите разбить на несколько строк при записи в обычный файл. Использование \r\n может не сработать, поэтому просто добавьте PHP_EOL в свой скрипт, и результат будет потрясающим. Посмотрите на этот простой пример ниже:
<?php
$output = ' Это строка 1' . PHP_EOL .
' Это строка 2' . PHP_EOL .
' Это строка 3';
$file = "filename.txt";
if (is_writable($file)) {
// В нашем примере мы открываем $file в режиме append.
// Указатель файла находится в конце файла, следовательно.
// именно туда попадет $output, когда мы запишем его через fwrite().
if (!$handle = fopen($file, 'a')) {
echo "Не удалось открыть файл ($file)";
exit;
}
// Записываем $output в наш открытый файл.
if (fwrite($handle, $output) === FALSE) {
echo "Не удалось записать в файл ($file)";
exit;
}
echo "Успех, содержимое ($output) записано в файл ($file)";
fclose($handle);
} else {
echo "Файл $file не доступен для записи";
}
?>
Web