fprintf
Записывает строку, созданную с использованием строки формата format , в поток, дескриптор которого передаётся в параметре stream .
Список параметров
Указатель ( resource ) на файл, обычно создаваемый с помощью функции fopen() .
Строка формата состоит из нуля или более директив: обычные символы (за исключением % ), которые просто выводятся без изменения и спецификаторы преобразования, каждый из которых требует передачи своего параметра.
Спецификаторы преобразования имеют следующий формат: %[argnum$][flags][width][.precision]specifier .
Argnum
Целое число, за которым следует знак доллара $ , чтобы указать, какой числовой аргумент обрабатывать при преобразовании.
| Флаг | Описание |
|---|---|
| — | Выравнивание по левому краю в пределах заданной ширины поля; По умолчанию выравнивание происходит по правому краю. |
| + | Печатает плюс + у не отрицательных чисел; По умолчанию знак печатается только у отрицательных чисел. |
| (space) | Дополняет результат пробелами. Это поведение по умолчанию. |
| 0 | Дополняет числа нулями (только слева). Со спецификатором s также может дополнять нулями справа. |
| ‘ (char) | Дополняет результат символом (char). |
Ширина
Либо целое число, указывающее, сколько символов (минимум) должно получиться в результате преобразования, либо * . Если указано значение * , то ширина задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.
Точность
- Для спецификаторов e , E , f и F : задаёт количество цифр после десятичной запятой (по умолчанию 6).
- Для спецификаторов g , G , h и H : задаёт максимальное значение печатаемых значащих цифр.
- Для спецификатора s : задаёт ограничение максимального количества символов в строке, которые будут выведены.
Замечание: Если указана точка без последующего значения точности, то точность будет считаться за 0. Если указано значение * , точность задаётся как дополнительное целое значение, предшествующее значению, отформатированному спецификатором.
Пусть P равно точности, если она не равно нулю, 6 — если точность не задана и 1, если точность задана как 0. Тогда, если преобразование со стилем «E» будет иметь показатель степени X:
Если P > X ≥ −4, преобразование будет в стиле «f» и точность будет P − (X + 1). В обратном случае, преобразование будет в стиле «e» и точность будет P − 1.
Внимание
Спецификатор c игнорирует значения ширины и дополнения
Внимание
Попытка использовать спецификаторы с указанием ширины для строки в многобайтовой кодировке может привести к неожиданным результатам.
Переменные будут приведены к подходящему для спецификатора типу:
| Тип | Спецификатор |
|---|---|
| string | s |
| int | d , u , c , o , x , X , b |
| float | e , E , f , F , g , G , h , H |
Возвращаемые значения
Возвращает длину записанной строки.
Ошибки
Начиная с PHP 8.0.0, если количество аргументов равно нулю, выбрасывается исключение ValueError . До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING .
Начиная с PHP 8.0.0, если [width] меньше нуля или больше PHP_INT_MAX , выбрасывается исключение ValueError . До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING .
Начиная с PHP 8.0.0, если [precision] меньше нуля или больше PHP_INT_MAX , выбрасывается исключение ValueError . До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING .
Начиная с PHP 8.0.0, если аргументов задано меньше, чем требуется, выбрасывается исключение ArgumentCountError . До PHP 8.0.0 вместо этого выдавалась ошибка уровня E_WARNING .
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | Функция больше не возвращает false в случае возникновения ошибки. |
| 8.0.0 | Выбрасывает исключение ValueError , если количество аргументов равно нулю; ранее функция выдавала ошибку уровня E_WARNING . |
| 8.0.0 | Выбрасывает исключение ValueError , если [width] меньше нуля или больше PHP_INT_MAX ; ранее функция выдавала ошибку уровня E_WARNING . |
| 8.0.0 | Выбрасывает исключение ValueError , если [precision] меньше нуля или больше PHP_INT_MAX ; ранее функция выдавала ошибку уровня E_WARNING . |
| 8.0.0 | Выбрасывает исключение ArgumentCountError , если аргументов задано меньше, чем требуется; ранее функция выдавала ошибку уровня E_WARNING . |
Примеры
Пример #1 fprintf() : заполнение нулями
fprintf ( $fp , «%04d-%02d-%02d» , $year , $month , $day );
// запишет форматированную ISO-дату в файл date.txt
?>
Пример #2 fprintf() : форматирование денежных величин
$money1 = 68.75 ;
$money2 = 54.35 ;
$money = $money1 + $money2 ;
// echo $money выведет «123.1»;
$len = fprintf ( $fp , ‘%01.2f’ , $money );
// строка «123.10» записана в файл currency.txt
echo «записано $len байт в файл currency.txt» ;
// используйте возвращаемое из fprintf значение для определения количества записанных байт
?>
Смотрите также
- printf() — Выводит отформатированную строку
- sprintf() — Возвращает отформатированную строку
- vprintf() — Выводит отформатированную строку
- vsprintf() — Возвращает отформатированную строку
- vfprintf() — Записывает отформатированную строку в поток
- sscanf() — Разбирает строку в соответствии с заданным форматом
- fscanf() — Обрабатывает данные из файла в соответствии с форматом
- number_format() — Форматирует число с разделением групп
- date() — Форматирует временную метку Unix
fopen
fopen() закрепляет именованный ресурс, указанный в аргументе filename , за потоком.
Список параметров
Если filename передан в форме «scheme://. «, он считается URL и PHP проведёт поиск обработчика протокола (также известного как «обёртка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.
Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили open_basedir, то накладываются дальнейшие ограничения.
Если PHP установил, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.
Замечание:
Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обёртки. Некоторые протоколы ( обёртки ) поддерживают контекст и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обёрткой http ).
На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.
$handle = fopen ( «c:\\folder\\resource.txt» , «r» );
?>?php
Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:
| mode | Описание |
|---|---|
| ‘r’ | Открывает файл только для чтения; помещает указатель в начало файла. |
| ‘r+’ | Открывает файл для чтения и записи; помещает указатель в начало файла. |
| ‘w’ | Открывает файл только для записи; в противном случае ведёт себя так же, как и ‘w+’ . |
| ‘w+’ | Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать. |
| ‘a’ | Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются в конец. |
| ‘a+’ | Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() влияет только на позицию чтения, записи всегда добавляются в конец. |
| ‘x’ | Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку уровня E_WARNING . Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2) . |
| ‘x+’ | Создаёт и открывает для чтения и записи; в остальном имеет то же поведение, что и ‘x’ . |
| ‘c’ | Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от ‘w’ ), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’ ). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотрите flock() ) перед изменением, так как использование ‘w’ может обрезать файл ещё до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку). |
| ‘c+’ | Открывает файл для чтения и записи; в остальном имеет то же поведение, что и ‘c’ . |
| ‘e’ | Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008. |
Замечание:
Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют \n в качестве символа конца строки, системы семейства Windows используют \r\n в качестве символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют \r в качестве символа конца строки.
Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».
Windows предлагает флаг режима текстовой трансляции ( ‘t’ ), который автоматически переведёт \n в \r\n во время работы с файлом. И наоборот — вы также можете использовать ‘b’ , чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ последней буквой параметра mode .
Флагом трансляции по умолчанию является ‘b’ . Вы можете использовать режим ‘t’ , если работаете с текстовыми файлами и используете \n для обозначения конца строки в вашем скрипте, но при этом предполагаете, что ваши файлы будут использоваться в таких приложениях, как «Блокнот» (в устаревших версиях). Во всех остальных случаях используйте флаг ‘b’ .
Если вы укажете флаг ‘t’ во время работы с бинарными файлами, вы можете столкнуться со странными проблемами с вашими данными, включая повреждённые файлы изображений и проблемы с символами \r\n .
Замечание:
Опять же из соображений портируемости крайне рекомендуется переписать старый код, который полагается на режим ‘t’ , чтобы вместо этого он использовал правильные концы строк и режим ‘b’ .
Замечание: Параметр mode игнорируется при работе с обёртками потока php://output , php://input , php://stdin , php://stdout , php://stderr и php://fd .
use_include_path
Необязательный третий параметр use_include_path может быть установлен в ‘1’ или true , если вы также хотите провести поиск файла в include_path.
Возвращаемые значения
Возвращает указатель на файл в случае успешного выполнения или false в случае возникновения ошибки
Ошибки
В случае неудачного завершения работы генерируется ошибка уровня E_WARNING .
Список изменений
| Версия | Описание |
|---|---|
| 7.0.16, 7.1.2 | Добавлена опция ‘e’ . |
Функция fgets в PHP, описание и примеры
Функция fgets() считывает и возвращает строку из файла. В случае возникновения ошибки возвращает False.
Версия PHP 3 и выше.
function fgets (resource handle [, int length])
Параметры функции fgets
| handle | Указатель на ресурс, открытый функцией fopen. |
| length | Необязательное числовое значение, указывающее размер получаемой строки в байтах. По умолчанию равно 1 Кб. Если задано, то при строке больше этого размера она будет обрезана. |
Примеры использования функции fgets
$f = fopen("myfile.txt", "r"); // открытие файла в режиме чтения echo fgets($f); // считывание и вывод одной строки echo echo fgets($f, 50); // считывание и вывод одной строки размером 50 байт fclose($f);// закрытие файла
$f = fopen("myfile.txt", "r"); while (!feof($f)) < // считывание и вывод всего содержимого файла $s = fgets($f); echo $s; >fclose($f);
Выражения
Выражения — это самые важные строительные элементы PHP. Почти всё, что вы пишете в PHP, является выражением. Самое простое и точное определение выражения — «все что угодно, имеющее значение».
Основными формами выражений являются константы и переменные. Если вы записываете $a = 5 , вы присваиваете 5 переменной $a . 5 , очевидно, имеет значение 5 или, другими словами, 5 — это выражение со значением 5 (в данном случае 5 — это целочисленная константа).
После этого присвоения вы ожидаете, что значением $a также является 5, поэтому, если вы написали $b = $a , вы полагаете, что работать это будет так же, как если бы вы написали $b = 5 . Другими словами, $a это также выражение со значением 5. Если всё работает верно, то именно так и произойдёт.
Немного более сложными примерами выражений являются функции. Например, рассмотрим следующую функцию:
function foo ()
return 5 ;
>
?>?php
Исходя из того, что вы хорошо знакомы с концепцией функций (если нет, то прочитайте главу о функциях), вы полагаете, что запись $c = foo() абсолютно эквивалентна записи $c = 5 , и вы правы. Функции — это выражения, значением которых является то, что возвращает функция. Поскольку foo() возвращает 5, значением выражения ‘ foo() ‘ является 5. Как правило, функции возвращают не просто статическое значение, а что-то вычисляют.
Разумеется, значения в PHP не обязаны быть целочисленными, и очень часто ими не являются. PHP поддерживает четыре типа скалярных значений: целочисленные ( int ), с плавающей точкой ( float ), строковые значения ( string ) и булевы ( bool ) значения (скалярными являются значения, которые вы не можете ‘разбить’ на меньшие части, в отличие, например, от массивов). PHP поддерживает также два комбинированных (не скалярных) типа: массивы и объекты. Любое значение такого типа может присваиваться переменной или возвращаться функцией.
Однако PHP, как и многие другие языки, понимает гораздо больше выражений. PHP — это язык, ориентированный на выражения и рассматривающий почти все как выражение. Вернёмся к примеру, с которым мы уже имели дело: $a = 5 . Легко заметить, что здесь присутствуют два значения — значение целочисленной константы 5 и значение переменной $a , также принимающей значение 5. Но на самом деле здесь присутствует и ещё одно значение — значение самого присвоения. Само присвоение вычисляется в присвоенное значение, в данном случае — в 5. На практике это означает, что $a = 5 , независимо от того, что оно делает, является выражением со значением 5. Таким образом, запись $b = ($a = 5) равносильна записи $a = 5; $b = 5; (точка с запятой обозначает конец выражения). Поскольку операции присвоения анализируются справа налево, вы также можете написать $b = $a = 5 .
Другой хороший пример ориентированности на выражения — префиксный и постфиксный инкремент и декремент. Пользователи PHP и многих других языков возможно уже знакомы с формой записи variable++ и variable— . Это операторы инкремента и декремента. Также как и C, PHP поддерживает два типа инкремента — префиксный и постфиксный. Они оба инкрементируют значение переменной и эффект их действия на неё одинаков. Разница состоит в значении выражения инкремента. Префиксный инкремент, записываемый как ++$variable , вычисляется в инкрементированное значение (PHP инкрементирует переменную до того как прочесть её значение, отсюда название ‘пре-инкремент’). Постфиксный инкремент, записываемый как $variable++ , вычисляется в первоначальное значение переменной $variable до её приращения (PHP инкрементирует переменную после прочтения её значения, отсюда название ‘пост-инкремент’).
Очень распространённым типом выражений являются выражения сравнения. Результатом вычислений являются false (ложь) или true (истина). PHP поддерживает операции сравнения > (больше), >= (больше либо равно), == (равно), != (не равно), < (меньше) и
Последний пример выражений, который мы здесь рассмотрим, это смешанные выражения операции и присвоения. Вы уже знаете, что если вы хотите увеличить $a на 1, вы можете просто написать $a++ или ++$a . Но что, если вы хотите прибавить больше, чем единицу, например, 3? Вы могли бы написать $a++ много раз, однако, очевидно это не очень рациональный и удобный способ. Гораздо более распространённой практикой является запись вида $a = $a + 3 . $a + 3 вычисляется в значение $a плюс 3 и снова присваивается $a , увеличивая в результате $a на 3. В PHP, как и в некоторых других языках, таких как C, вы можете записать это более коротким образом, что увеличит очевидность смысла и быстроту понимания кода по прошествии времени. Прибавить 3 к текущему значению $a можно с помощью записи $a += 3 . Это означает дословно «взять значение $a , прибавить к нему 3 и снова присвоить его переменной $a «. Кроме большей понятности и краткости, это быстрее работает. Значением $a += 3 , как и обычного присвоения, является присвоенное значение. Обратите внимание, что это НЕ 3, а суммированное значение $a плюс 3 (то, что было присвоено $a ). Таким образом может использоваться любой бинарный оператор, например, $a -= 5 (вычесть 5 из значения $a ), $b *= 7 (умножить значение $b на 7) и т.д.
Существует ещё одно выражение, которое может выглядеть необычно, если вы не встречали его в других языках — тернарный условный оператор:
$first ? $second : $third
?>?php
Если значением первого подвыражения является true (не ноль), то выполняется второе подвыражение, которое и будет результатом условного выражения. В противном случае будет выполнено третье подвыражение и его значение будет результатом.
Следующий пример должен помочь вам немного улучшить понимание префиксного и постфиксного инкремента и выражений:
function double ( $i )
return $i * 2 ;
>
$b = $a = 5 ; /* присвоить значение пять переменным $a и $b */
$c = $a ++; /* постфиксный инкремент, присвоить значение $a
(5) переменной $c */
$e = $d = ++ $b ; /* префиксный инкремент, присвоить увеличенное
значение $b (6) переменным $d и $e */
?php
/* в этой точке и $d, и $e равны 6 */
$f = double ( $d ++); /* присвоить удвоенное значение $d перед
инкрементом (2*6 = 12) переменной $f */
$g = double (++ $e ); /* присвоить удвоенное значение $e после
инкремента (2*7 = 14) переменной $g */
$h = $g += 10 ; /* сначала переменная $g увеличивается на 10,
приобретая, в итоге, значение 24. Затем значение
присвоения (24) присваивается переменной $h,
которая в итоге также становится равной 24. */
?>
Некоторые выражения могут рассматриваться как инструкции. В данном случае инструкция имеет вид ‘ expr ; ‘ — выражение с последующей точкой с запятой. В записи $b = $a = 5; , $a = 5 — это верное выражение, но само по себе не инструкция. Тогда как $b = $a = 5; является верной инструкцией.
Последнее, что стоит упомянуть, это истинность значения выражений. Во многих случаях, как правило, в условных операторах и циклах, вас может интересовать не конкретное значение выражения, а только его истинность (значение true или false ). Константы true и false (регистронезависимые) — это два возможных булевых значения. Выражения можно автоматически преобразовать в логическое значение. Подробнее о том, как это сделать, рассказано в разделе о приведении типов.
PHP предоставляет полную и мощную реализацию выражений, и их полное документирование выходит за рамки этого руководства. Примеры выше дают представление о выражениях, о том, что они из себя представляют, и как можно создавать полезные выражения. Для обозначения любого верного выражения PHP в этой документации будет использовано сокращение expr .