mirror of
https://github.com/php/doc-ru.git
synced 2026-03-23 23:32:16 +01:00
* Update types.xml to en * Update array.xml to en + infostyle * Update boolean.xml to en * Update callable.xml to en * Update float.xml to en * Update integer.xml to en * Update iterable.xml to en * Update numeric-strings.xml to en * Update object.xml to en * Update type-juggling.xml to en
157 lines
7.9 KiB
XML
157 lines
7.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: e587d0655e426f97b3fcb431453da5030e743b23 Maintainer: rjhdby Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<sect1 xml:id="language.types.numeric-strings" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>Числовые строки</title>
|
||
<para>
|
||
PHP считает строку (<type>string</type>) числовой, если строку возможно интерпретировать как целое
|
||
число (<type>int</type>) или как число с плавающей точкой (<type>float</type>).
|
||
</para>
|
||
|
||
<para>
|
||
Формально с PHP 8.0.0:
|
||
</para>
|
||
|
||
<informalexample>
|
||
<programlisting>
|
||
<![CDATA[
|
||
WHITESPACES \s*
|
||
LNUM [0-9]+
|
||
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
|
||
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
|
||
INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES}
|
||
FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES}
|
||
NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
|
||
<para>
|
||
В PHP также поддерживается концепция <emphasis>префиксной</emphasis> числовой строки.
|
||
Это строка, которая начинается как числовая и продолжается любыми другими символами.
|
||
</para>
|
||
|
||
<note>
|
||
<para>
|
||
Строка, которая содержит букву <literal>E</literal> (без учёта регистра),
|
||
ограниченную цифрами, воспринимается как число, которое выразили в научной нотации.
|
||
Поведение при сравнении строк с числами в научной нотации иногда кажется неожиданным.
|
||
</para>
|
||
<example>
|
||
<title>Сравнение строк с числами в научной нотации</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
var_dump("0D1" == "000"); // false, "0D1" — не научная нотация
|
||
var_dump("0E1" == "000"); // true, "0E1" интерпретируется как выражение 0 * (10 ^ 1), которое равно значению 0
|
||
var_dump("2E1" == "020"); // true, "2E1" интерпретируется как выражение 2 * (10 ^ 1), которое равно значению 20
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</note>
|
||
|
||
<sect2 xml:id="language.types.numeric-string.conversion">
|
||
<title>Строки в числовых контекстах</title>
|
||
<para>
|
||
Когда строку необходимо использовать как число (например арифметические операции, декларация
|
||
целочисленного типа, и т. д.), применяют следующий алгоритм действий:
|
||
<orderedlist>
|
||
<listitem>
|
||
<simpara>
|
||
Строка приводится к типу <type>int</type>, если строка числовая, представляет целое число и не превышает максимально
|
||
допустимого значения для типа <type>int</type>, которое определяет
|
||
константа <constant>PHP_INT_MAX</constant>, иначе строка приводится к типу <type>float</type>.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Тип <type>string</type> приводится к типу <type>int</type>, если контекст разрешает строки,
|
||
которые начинаются с числа, и значение <type>string</type>
|
||
начинается с целочисленной числовой части, которая не превышает значение константы <constant>PHP_INT_MAX</constant>,
|
||
которая определяет в PHP наибольшее значение для типа <type>int</type>,
|
||
иначе строка разрешается
|
||
в тип <type>float</type> и дополнительно выдаёт ошибку
|
||
уровня <constant>E_WARNING</constant>.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Для нечисловых строк выбрасывается ошибка <classname>TypeError</classname>.
|
||
</simpara>
|
||
</listitem>
|
||
</orderedlist>
|
||
</para>
|
||
</sect2>
|
||
|
||
<sect2 xml:id="language.types.numeric-string.prior">
|
||
<title>Поведение до PHP 8.0.0</title>
|
||
<para>
|
||
До PHP 8.0.0 строка считалась числовой, только если она
|
||
<emphasis>начиналась</emphasis> с пробельных символов. PHP считал строку префиксной числовой,
|
||
если строка <emphasis>завершалась</emphasis> пробельными символами.
|
||
</para>
|
||
|
||
<para>
|
||
До PHP 8.0.0 при работе со строкой как с числом применялся приведённый алгоритм,
|
||
но с рядом отличий:
|
||
<itemizedlist>
|
||
<listitem>
|
||
<simpara>
|
||
Использование префиксной числовой строки вызывало ошибку уровня
|
||
<constant>E_NOTICE</constant>, а не <constant>E_WARNING</constant>.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Нечисловые строки вызывали ошибку уровня <constant>E_WARNING</constant>,
|
||
а сама строка приводилась к числу <literal>0</literal>.
|
||
</simpara>
|
||
</listitem>
|
||
</itemizedlist>
|
||
До PHP 7.1.0 не вызывалась ошибка ни уровня <constant>E_NOTICE</constant>,
|
||
ни уровня <constant>E_WARNING</constant>.
|
||
</para>
|
||
|
||
<informalexample>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$foo = 1 + "10.5"; // Переменная $foo — число с плавающей точкой (11.5)
|
||
$foo = 1 + "-1.3e3"; // Переменная $foo — число с плавающей точкой (-1299)
|
||
$foo = 1 + "bob-1.3e3"; // TypeError начиная с PHP 8.0.0. Ранее $foo принималось за целое число (1)
|
||
$foo = 1 + "bob3"; // TypeError начиная с PHP 8.0.0, Ранее $foo принималось за целое число (1)
|
||
$foo = 1 + "10 Small Pigs"; // Переменная $foo — целое (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
|
||
$foo = 4 + "10.2 Little Piggies"; // Переменная $foo — число с плавающей точкой (14.2). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
|
||
$foo = "10.0 pigs " + 1; // Переменная $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
|
||
$foo = "10.0 pigs " + 1.0; // Переменная $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
</sect2>
|
||
</sect1><!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|