





Да, PHP_EOL якобы используется для поиска символа новой строки кроссплатформенным способом, поэтому он решает проблемы DOS / Unix.
Обратите внимание, что PHP_EOL представляет собой символ конца строки для системы ток. Например, он не найдет конечную строку Windows при выполнении в unix-подобной системе.
Следует ли использовать его в качестве символа конца строки при написании сценария командной строки?
@Andre: А как насчет тех, кто пишет приложения для установки, использования и развертывания другими? Вы предлагаете, чтобы все они ограничили свои «поддерживаемые платформы» до * nix?
@Andre Может быть, потому что ваша платформа развертывания - Windows Azure?
@Stann - То, что делают «большие проекты», о которых вы знаете, вряд ли является решающим фактором для лучшей практики, не говоря уже о том, что полезно или нет. Я поддерживаю «большой проект», который частично развернут на нескольких хостах, включая некоторые серверы Windows. Не предполагайте - константы ничего не повредят и представляют собой вполне допустимый способ написания кода, независимого от платформы. Ваши комментарии об обратном несколько абсурдны.
Вот почему в Sublime Text или любой другой IDE, которую вы используете, у вас есть возможность использовать 3 разных конца строк: Unix, OSX, DOS или auto. Правильный символ «Конец линии» для этой платформы. Доступно с PHP 4.3.10 и PHP 5.0.2. php.net/manual/en/reserved.constants.php
Нет, я не думаю, что ваш ответ правильный. Вы генерируете код в одной системе, но отправляете вывод в другую систему. PHP_EOL, однако, сообщает вам ограничитель конца строки ТОЛЬКО для системы, в которой он используется. Это не гарантирует, что другая система использует тот же разделитель. Смотрите мой ответ ниже.
"для локальной системы" следует включить, но я думаю, что это всем известно.
но не используйте PHP_EOL для данных, отправленных из формы.
Официальная документация по PHP_EOL должна быть на php.net. Поиск PHP_EOL не дает прямой целевой страницы (php.net/manual-lookup.php?pattern=php_eol&scope=quickref). Существует как раз указанная выше информация @ MichaelJ.Calkins (php.net/manual/en/reserved.constants.php).
Вы используете PHP_EOL, когда вам нужна новая линия, и вы хотите быть кроссплатформенным.
Это может быть, когда вы записываете файлы в файловую систему (журналы, экспорт и т. д.).
Вы можете использовать его, если хотите, чтобы ваш сгенерированный HTML был читабельным. Таким образом, вы можете последовать за своим <br /> с PHP_EOL.
Вы могли бы использовать его, если вы запускаете php как скрипт из cron, и вам нужно что-то вывести и отформатировать для экрана.
Вы можете использовать его, если вы создаете электронное письмо для отправки, которое требует некоторого форматирования.
Вам не нужно использовать независимые от платформы символы новой строки при создании HTML.
@Rob, Если бы более старые версии IE дали мне лучшую программу просмотра исходных текстов страниц, чем блокнот Windows, я, возможно, согласился бы с вами.
@Zoredache - HTML будет сгенерирован с символами новой строки, подходящими для платформы, на которой работает PHP, не обязательно подходящей для платформы, с которой вы получаете доступ к страницам.
+1 за упоминание о создании электронной почты $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
PHP_EOL не следует использовать для разделения заголовков электронной почты. According to Почта PHP manual, multiple extra headers should be separated with a CRLF (\r\n).
@ HalilÖzgür Это правда. RFC. Но к сожалению, это не так в PHP. И я проверил, у v5.4.11 такой же код.
@ ring0, к сожалению :) Всякий раз, когда мне нужно отправлять электронные письма на PHP, в большинстве случаев я использую Swift Mailer; для бесконечного множества деталей требований к формату электронной почты и несоответствий PHP.
Пример: $ headers = 'From: [email protected]'. "\ г \ п". "Ответить: [email protected]". "\ г \ п". 'X-Mailer: PHP /'. phpversion ();
@ halil-ozgur можно ли использовать PHP_EOF для строк внутри тела почты в PHP?
@ Lexib0y TL; DR; нет, используйте CRLF. Вы имеете в виду PHP_EOL, верно? Согласно последнему RFC, нет. Вы также должны использовать CRLF. Но различные почтовые серверы и клиенты могут выглядеть терпимыми, даже если вы используете PHP_EOL (который является CRLF только в Windows и LF для большинства других), но я все равно не стал бы на них полагаться.
Да, я имел ввиду PHP_EOL. Спасибо за информацию. Мне трудно найти относительную информацию в одном месте или вообще найти. Я никогда особо не вдавался в RFC. Спасибо за Ваш ответ.
You might use it if you where building up an email to send that needed some formatting.. Какой ужасный пример, как будто получатель определенно будет использовать ту же ОС.
Определение PHP_EOL заключается в том, что он дает вам символ новой строки операционной системы, над которой вы работаете.
На практике вам это почти никогда не понадобится. Рассмотрим несколько случаев:
Когда вы выводите данные в Интернет, на самом деле нет никаких соглашений, за исключением того, что вы должны быть последовательны. Поскольку большинство серверов являются Unixy, вы все равно захотите использовать "\ n".
Если вы выводите в файл, PHP_EOL может показаться хорошей идеей. Однако вы можете получить аналогичный эффект, поместив буквальный символ новой строки внутри вашего файла, и это поможет вам, если вы пытаетесь запустить некоторые файлы в формате CRLF в Unix, не сбивая существующие символы новой строки (как парень с системой с двойной загрузкой , Могу сказать, что предпочитаю последнее поведение)
PHP_EOL настолько длинный, что не стоит его использовать.
-1 за «PHP_EOL такой смехотворно длинный». Это неверный аргумент.
Я полностью согласен с тобой. Нет никакого смысла разворачивать php на чем угодно, кроме * nix. Таким образом, нет смысла использовать PHP_EOL или DIRECTORY_SEPARATOR.
@Stann Не могли бы вы объяснить свою точку зрения о том, что «нет никакого смысла развертывать php на чем-либо, кроме * nix»?
@Sajuuk Я думаю, это можно было бы назвать "сарказмом".
Удобно с error_log (), если вы выводите несколько строк.
Я обнаружил, что многие отладочные операторы выглядят странно при моей установке Windows, поскольку разработчики предполагали окончания unix при разбиении строк.
Я использую константу PHP_EOL в некоторых сценариях командной строки, которые мне приходилось писать. Я разрабатываю на своей локальной машине с Windows, а затем тестирую на сервере Linux. Использование константы означало, что мне не нужно было беспокоиться об использовании правильного окончания строки для каждой из разных платформ.
Я использую WebCalendar и обнаружил, что Mac iCal блокирует импорт сгенерированного файла ics, потому что конец строки жестко запрограммирован в xcal.php как «\ r \ n». Я вошел и заменил все вхождения на PHP_EOL, и теперь iCal счастлив! Я также тестировал его в Vista, и Outlook также смог импортировать файл, даже если символ конца строки - «\ n».
<late> Это означает, что ваше приложение выйдет из строя при развертывании на сервере Windows. Если вам нужен \n, используйте его явно.
Я предпочитаю использовать \ n \ r. Также я использую систему Windows, и \ n, по моему опыту, отлично работает.
Поскольку PHP_EOL не работает с регулярными выражениями, а это наиболее полезный способ работы с текстом, я действительно никогда не использовал его и не нуждался в этом.
Остерегайтесь порядка символа новой строки, он должен быть \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline
Вы не используете его, но ваш сайт может быть открыт кем угодно на любом компьютере, поэтому это может быть проблемой
Когда jumi (плагин joomla для PHP) компилирует ваш код, по какой-то причине он удаляет все обратные косые черты из вашего кода. Так что что-то вроде $csv_output .= "\n"; становится $csv_output .= "n";
Очень досадный баг!
Вместо этого используйте PHP_EOL, чтобы получить желаемый результат.
Я действительно ДЕЙСТВИТЕЛЬНО надеюсь, что это проблема конфигурации, которую вы еще не нашли. Я не использовал joomla, но какое ужасное поведение, если это действительно так!
Я нашел 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";
}
?>
\ n \ r никогда не будет работать, поскольку последовательность предназначена для \ r \ n </pedantry>
Стандартным символом новой строки DOS / Windows является CRLF (= \ r \ n), а не LFCR (\ n \ r). Если мы поставим последнее, это может привести к неожиданному (ну, на самом деле, ожидаемому!: D) поведению.
В настоящее время почти все (хорошо написанные) программы принимают стандартный LF (\ n) UNIX для кода новой строки, даже демоны отправителя почты (RFC устанавливает CRLF как новая линия для заголовков и тела сообщения).
Есть одно очевидное место, где это может быть полезно: когда вы пишете код, который преимущественно использует строки с одинарными кавычками. Спорный вопрос:
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Искусство этого - быть последовательным. Проблема со смешиванием и сопоставлением "" и "" заключается в том, что когда вы получаете длинные строки, вам действительно не нужно искать, какой тип цитаты вы использовали.
Как и все в жизни, это зависит от контекста.
Из 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, что иногда для них неудобно.
Я просто хотел показать возможные значения PHP_EOL, поддерживаемые источниками PHP, поскольку он еще не был показан здесь ...
Вау. Разработчики PHP ошибаются в этом. В приведенной вами ссылке на Википедию Mac OS 9 и ранее использовала «\ r», но не OS X, которая использует «\ n». Кто-то должен отправить отчет об ошибке ...
@ imgx64 Да, может быть, но, честно говоря, вы когда-нибудь видели производственный MAC-сервер?
@ imgx64 Это было исправлено через 33 дня после вашего сообщения :) Я обновил свой ответ, чтобы отразить текущие источники.
Я не думаю, что аргумент в пользу использования PHP_EOL для вывода (!) Верен. PHP_EOL является серверным, тогда как вывод обычно предназначен для клиента (который использует разные разделители конца строки). Пример: если вы создаете многострочный текстовый вывод в системе Linux с помощью PHP_EOL и отправляете его в систему Windows, это не будет допустимый ограничитель конца строки - это будет зависеть от того, какое клиентское программное обеспечение будет отображать вывод. Браузеры и некоторые текстовые редакторы могут справиться с этим, но если вы просматриваете текст, например, в Блокноте, все будет в одной строке.
php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;", чтобы узнать.
PHP_EOL (string) The correct 'End Of Line' symbol for this platform. Available since PHP 4.3.10 and PHP 5.0.2
Вы можете использовать эту константу при чтении или записи текстовых файлов в файловой системе сервера.
Окончания строк в большинстве случаев не имеют значения, поскольку большинство программ способно обрабатывать текстовые файлы независимо от их происхождения. Вы должны соответствовать своему коду.
Если окончания строки имеют значение, явно укажите окончания строки вместо использования константы. Например:
\r\n\r\n в качестве разделителя строкисточник для «HTTP-заголовки должны быть ...»: ietf.org/rfc/rfc2616.txt глава 4 раздел 1
Вы пишете код, который преимущественно использует строки в одинарных кавычках.
echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;
echo 'this other $one'."\n";
Я хотел бы добавить ответ, который касается «Когда нет использовать его», поскольку он еще не был рассмотрен, и я могу представить, что он используется вслепую, и никто не замечает, что существует проблема, до более позднего времени. Некоторые из них несколько противоречат некоторым существующим ответам.
При выводе на веб-страницу в HTML, особенно текста в <textarea>, <pre> или <code>, вы, вероятно, всегда захотите использовать \n, а не PHP_EOL.
Причина этого в том, что, хотя код может хорошо работать на одном сервере - который оказывается платформой типа Unix - при развертывании на хосте Windows (например, платформе Windows Azure) он может изменить способ отображения страниц в некоторых браузерах. (в частности, Internet Explorer - некоторые версии которого будут видеть как \ n, так и \ r).
Я не уверен, что это все еще проблема с IE6 или нет, так что это может быть довольно спорным, но, кажется, стоит упомянуть, помогает ли это людям задуматься о контексте. Могут быть и другие случаи (например, строгий XHTML), когда внезапный вывод \r на некоторых платформах может вызвать проблемы с выводом, и я уверен, что есть и другие крайние случаи, подобные этому.
Как кто-то уже заметил, вы не захотите использовать его при возврате заголовков HTTP, поскольку они всегда должны следовать RFC на любой платформе.
Я бы не стал использовать его для чего-то вроде разделителей в файлах CSV (как кто-то предложил). Платформа, на которой работает сервер, не должна определять окончания строк в сгенерированных или потребляемых файлах.
У меня есть сайт, на котором сценарий ведения журнала записывает новую строку текста в текстовый файл после действия пользователя, который может использовать любую ОС.
Использование PHP_EOL в этом случае не кажется оптимальным. Если пользователь работает с Mac OS и пишет в текстовый файл, он помещает \ n. При открытии текстового файла на компьютере с Windows разрыв строки не отображается. По этой причине я использую вместо этого "\ r \ n", который работает при открытии файла в любой ОС.
Нет, PHP_EOL не обрабатывает проблемы с конечной строкой, потому что система, в которой вы используете эту константу, не совпадает с системой, в которую вы отправляете вывод.
Я бы вообще не рекомендовал использовать PHP_EOL. Unix / Linux использует \ n, MacOS / OS X также изменен с \ r на \ n, и в Windows многие приложения (особенно браузеры) также могут отображать его правильно. В Windows также легко изменить существующий код на стороне клиента, чтобы использовать только \ n и при этом поддерживать обратную совместимость: просто измените разделитель для обрезки строки с \ r \ n на \ n и оберните его в функцию, подобную trim () .
Было бы неплохо узнать, почему мой ответ отвергнут ... Безумно ... Принятый ответ - неправильный, а мой правильный. В целом неверно утверждать, что PHP_EOL решает эту проблему. Его можно (и нужно) использовать при чтении или записи ИСКЛЮЧИТЕЛЬНО чего-либо в / из системы такой же. Но в большинстве случаев PHP используется для отправки чего-либо обратно клиенту (что, скорее всего, именно об этом думал собеседник). Опять же: PHP_EOL - это чисто серверная константа. Он НЕ (и не может) правильно обрабатывать разрывы строк на стороне клиента. Напишите, пожалуйста, комментарий и скажите, если считаете, что я что-то не так написал.
+1 за хорошую точку зрения. Я думаю, что это потеряно, потому что браузеры не отображают пробелы в html, поэтому обычно используются консольные приложения. И, как вы сказали, в этом случае конец строки будет интерпретироваться для среды выполнения, что имеет смысл для консольных приложений, но не для веб-приложений клиент-сервер.
Что ж, ответ на самом деле не имеет отношения. Вы упоминаете совместимость браузера и отправку файлов в другие системы. Новая строка актуальна при выводе текста, поэтому браузеры не актуальны. И вопреки вашей основной мысли, эти текстовые файлы являются обычно используются на той же платформе, на которой они написаны.
В некоторых системах может быть полезно использовать эту константу, потому что если, например, вы отправляете электронное письмо, вы можете использовать PHP_EOL, чтобы кросс-системный скрипт работал с большим количеством систем ... но даже если это полезно когда-нибудь, вы можете найти это constant undefined, современный хостинг с последним движком 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. Так что я должен разместить здесь свои выводы для следующего человека.
А) эхо «Мой текст». PHP_EOL; // Плохо, потому что это просто выводит \ n, и большинство версий блокнота Windows отображают это в одной строке, и большинство программ бухгалтерского учета Windows не могут импортировать этот тип символа конца строки.
Б) echo 'Мой текст \ r \ n'; // Плохо, потому что строки php в одинарных кавычках не интерпретируют \ r \ n
В) эхо "Мой текст \ r \ n"; // Ура, работает! Правильно выглядит в блокноте и работает при импорте файла в другое программное обеспечение Windows, такое как программное обеспечение для бухгалтерского учета Windows и программное обеспечение для производства Windows.
Я думаю, что в ответах, за которые проголосовали на этой странице, есть много вводящих в заблуждение советов. Если вы запустите сценарий на двух разных платформах, а затем сравните выходные или сгенерированные данные (файлы журналов, html-страницу, записи базы данных и т. д.), То PHP_EOL приведет к несоответствию в diff. В большинстве случаев это не то, что вам нужно.