svn: /phpdoc/ja/trunk/ language/operators.xml language/types/float.xml language/types/integer.xml language/types/numeric-strings.xml language/types/string.xml language/types/type-juggling.xml language/types.xml reference/math/functions/round.xml reference/var/functions/is-numeric.xml
[email protected] (Yoshinari Takaoka)
| Newsgroups | php.doc.ja |
|---|---|
| Message-ID | <[email protected]> |
mumumu Fri, 27 Nov 2020 21:13:36 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=351708
Log:
Add a page about numeric strings
Closes GH-215
Changed paths:
U phpdoc/ja/trunk/language/operators.xml
U phpdoc/ja/trunk/language/types/float.xml
U phpdoc/ja/trunk/language/types/integer.xml
A phpdoc/ja/trunk/language/types/numeric-strings.xml
U phpdoc/ja/trunk/language/types/string.xml
U phpdoc/ja/trunk/language/types/type-juggling.xml
U phpdoc/ja/trunk/language/types.xml
U phpdoc/ja/trunk/reference/math/functions/round.xml
U phpdoc/ja/trunk/reference/var/functions/is-numeric.xml
svn-diffs-351708.txt
(text/x-diff, 21.6 KB)
Modified: phpdoc/ja/trunk/language/operators.xml
===================================================================
--- phpdoc/ja/trunk/language/operators.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/operators.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351340 Maintainer: takagi Status: ready -->
+<!-- EN-Revision: 351706 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,mumumu -->
<chapter xml:id="language.operators" xmlns="http://docbook.org/ns/docbook">
<title>演算子</title>
@@ -1448,14 +1448,25 @@
</tgroup>
</table>
<para>
- 整数値を文字列と比較したり、比較に数値形式の文字が含まれる場合は、文字列が
- <link linkend="language.types.string.conversion">数値に変換され</link>、
- 数値としての比較を行います。これらのルールは、
+ オペランドが両方
+ <link linkend="language.types.numeric-strings">数値文字列</link> の場合、
+ もしくは一方が数値で、もう一方が
+ <link linkend="language.types.numeric-strings">数値文字列</link> の場合、
+ 比較は数値として行われます。
+ これらのルールは
<link linkend="control-structures.switch">switch</link> 文にも適用されます。
- === あるいは !== による比較では型変換は発生しません。
- この場合は値だけでなく型も比較します。
- <informalexample>
- <programlisting role="php">
+ 型の変換は
+ 演算子が <literal>===</literal> や <literal>!==</literal> の場合は行われません。
+ なぜなら、これらの演算子は、値と型を両方比較するものだからです。
+ </para>
+
+ <warning>
+ <para>
+ PHP 8.0.0 より前のバージョンでは、
+ 文字列が数値または数値文字列の場合、文字列は比較する前に数値に変換されていました。
+ これによって、以下の例で見られるような驚きの結果が生じる場合があります:
+ <informalexample>
+ <programlisting role="php">
<![CDATA[
<?php
var_dump(0 == "a"); // 0 == 0 -> true
@@ -1473,7 +1484,13 @@
}
?>
]]>
- </programlisting>
+ </programlisting>
+ </informalexample>
+ </para>
+ </warning>
+
+ <para>
+ <informalexample>
<programlisting role="php">
<![CDATA[
<?php
Modified: phpdoc/ja/trunk/language/types/float.xml
===================================================================
--- phpdoc/ja/trunk/language/types/float.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/types/float.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351133 Maintainer: takagi Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<sect1 xml:id="language.types.float" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>浮動小数点数</title>
@@ -82,22 +82,38 @@
<sect2 xml:id="language.types.float.casting">
<title>float への変換</title>
-
- <para>
- 文字列型がどのようにして浮動小数点数に変換されるかに関する詳細な情報は、
- <link linkend="language.types.string.conversion">文字列の数値型への変換</link>
- のセクションをご覧ください。
- そのほかの型の浮動小数点数への変換については、整数型への変換と同様です。
- 詳細は<link linkend="language.types.integer.casting">整数型への変換</link>
- のセクションをご覧ください。
- </para>
- <note>
+ <sect3 xml:id="language.types.float.casting.from-string">
+ <title>文字列から float への変換</title>
+
+ <simpara>
+ 文字列が
+ <link linkend="language.types.numeric-strings">数値文字列</link>
+ の場合、対応する float の値に解決されます。
+ そうでない場合、ゼロ(<literal>0</literal>)に変換されます。
+ </simpara>
+ </sect3>
+
+ <sect3 xml:id="language.types.float.casting.from-other">
+ <title>他の型から float への変換</title>
+
<para>
- <type>object</type> が <type>float</type> に変換された場合、E_NOTICE がスローされます。
+ 文字列以外の値については、
+ まず最初に <type>int</type> に変換された後、
+ <type>float</type> に変換されます。
+ 詳細は
+ <link linkend="language.types.integer.casting">整数への変換</link>
+ を参照下さい。
</para>
- </note>
+ <note>
+ <para>
+ 型によっては、<type>int</type> に変換したときの動作が未定義のものがあります。
+ この場合、<type>float</type> に変換する場合の動作も未定義です。
+ </para>
+ </note>
+ </sect3>
+
</sect2>
<sect2 xml:id="language.types.float.comparison">
Modified: phpdoc/ja/trunk/language/types/integer.xml
===================================================================
--- phpdoc/ja/trunk/language/types/integer.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/types/integer.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351133 Maintainer: takagi Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<sect1 xml:id="language.types.integer">
<title>整数</title>
@@ -256,8 +256,10 @@
<title>文字列から</title>
<simpara>
- <link linkend="language.types.string.conversion">文字列変換
- </link>を参照ください。
+ 文字列が
+ <link linkend="language.types.numeric-strings">数値文字列</link>
+ の場合は、対応する整数値に解決されます。
+ そうでない場合は、ゼロ (<literal>0</literal>) に変換されます。
</simpara>
</sect3>
Added: phpdoc/ja/trunk/language/types/numeric-strings.xml
===================================================================
--- phpdoc/ja/trunk/language/types/numeric-strings.xml (rev 0)
+++ phpdoc/ja/trunk/language/types/numeric-strings.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 351703 Maintainer: mumumu Status: ready -->
+
+<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>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} [+-]? {EXPONENT_DNUM} {WHITESPACES}
+NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
+]]>
+ </programlisting>
+ </informalexample>
+
+ <para>
+ PHP は <emphasis>先頭から始まる</emphasis> 数値文字列という概念も持っています。
+ これは、数値文字列から始まり、その後に任意の文字が続く文字列です。
+ </para>
+
+ <sect2 xml:id="language.types.numeric-string.conversion">
+ <title>数値の文脈で使われる文字列</title>
+ <para>
+ 文字列が数値として評価される必要がある場合
+ (例: 算術演算や、<type>int</type> 型の宣言がある場合など)
+ は、次のステップを踏むことで結果が決まります:
+
+ <orderedlist>
+ <listitem>
+ <simpara>
+ 文字列が数値の場合、かつそれが
+ <type>int</type> 型の範囲
+ (<constant>PHP_INT_MAX</constant> で定義されています)
+ に含まれる場合、<type>int</type> に解決されます。
+ そうでない場合、<type>float</type> に解決されます。
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ 文脈が 先頭から始まる数値文字列を許す場合、
+ かつ値が文字列の場合は、次のように解決されます:
+
+ 文字列の先頭部分が数値文字列、かつそれが
+ <type>int</type> 型の範囲
+ (<constant>PHP_INT_MAX</constant> で定義されています)
+ に含まれる場合、<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> ホワイトスペースがある場合にだけ、
+ 文字列は数値と見なされていました。
+
+ <emphasis>数値の後に</emphasis> ホワイトスペースがある場合は、
+ その文字列は 先頭から始まる 数値文字列とみなされていました。
+ </para>
+
+ <para>
+ PHP 8.0.0 より前のバージョンでは、
+ 文字列が数値の文脈で使われる場合、既に述べたステップと同じ処理を行いますが、
+ 以下の違いがあります:
+
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ 先頭から始まる数値文字列の場合、
+ <constant>E_WARNING</constant> ではなく、
+ <constant>E_NOTICE</constant> が発生していました。
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ 文字列が数値でない場合、
+ <constant>E_WARNING</constant> が発生し、
+ <literal>0</literal> が返されていました。
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$foo = 1 + "10.5"; // $foo は float (11.5)
+$foo = 1 + "-1.3e3"; // $foo は float (-1299)
+$foo = 1 + "bob-1.3e3"; // PHP 8.0.0 以降は TypeError。それより前は、$foo は integer (1)
+$foo = 1 + "bob3"; // PHP 8.0.0 以降は TypeError。それより前は、$foo は integer (1)
+$foo = 1 + "10 Small Pigs"; // PHP 8.0.0 では $foo は integer (11) で、かつ E_WARNING。それより前は E_NOTICE
+$foo = 4 + "10.2 Little Piggies"; // PHP 8.0.0 では $foo は float (14.2) で、かつ E_WARNING。それより前は E_NOTICE
+$foo = "10.0 pigs " + 1; // PHP 8.0.0 では $foo は float (11) で、かつ E_WARNING。それより前は E_NOTICE
+$foo = "10.0 pigs " + 1.0; // PHP 8.0.0 では $foo は float (11) で、かつ 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
+-->
Property changes on: phpdoc/ja/trunk/language/types/numeric-strings.xml
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
\ No newline at end of property
Modified: phpdoc/ja/trunk/language/types/string.xml
===================================================================
--- phpdoc/ja/trunk/language/types/string.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/types/string.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351133 Maintainer: takagi Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<sect1 xml:id="language.types.string">
<title>文字列</title>
@@ -995,7 +995,9 @@
<note>
<para>
- 小数点を表す文字は、スクリプトのロケール (LC_NUMERIC カテゴリ)
+ PHP 8.0.0 以降では、小数点を表す文字は常に <literal>.</literal> です。
+ それより前のバージョンでは、
+ スクリプトのロケール (LC_NUMERIC カテゴリ)
によって決まります。
<function>setlocale</function> を参照ください。
</para>
@@ -1045,76 +1047,6 @@
</para>
</sect2>
- <sect2 xml:id="language.types.string.conversion">
- <title>文字列の数値への変換</title>
-
- <simpara>
- 数値として文字列が評価された時、結果の値と型は次のように定義されます。
- </simpara>
-
- <simpara>
- 文字列の中に '.' や 'e'、'E' といった文字が含まれず、
- 数値が integer 型の範囲内 (<constant>PHP_INT_MAX</constant>
- で定義されています) におさまる場合は
- <type>int</type> として評価されます。それ以外の場合は、すべて
- <type>float</type> として評価されます。
- </simpara>
-
- <para>
- 文字列の最初の部分により値が決まります。文字列が、
- 有効な数値データから始まる場合、この値が使用されます。その他の場合、
- 値は 0 (ゼロ) となります。有効な数値データは符号(オプション)の後に、
- 1 つ以上の数字 (オプションとして小数点を 1 つ含む)、
- オプションとして指数部が続きます。指数部は 'e' または 'E' の後に
- 1 つ以上の数字が続く形式です。
- </para>
-
- <informalexample>
- <programlisting role="php">
-<![CDATA[
-<?php
-$foo = 1 + "10.5"; // $foo は float です (11.5)
-$foo = 1 + "-1.3e3"; // $foo は float です (-1299)
-$foo = 1 + "bob-1.3e3"; // $foo は integer です (1)
-$foo = 1 + "bob3"; // $foo は integer です (1)
-$foo = 1 + "10 Small Pigs"; // $foo は integer です (11)
-$foo = 1 + "10 Little Piggies"; // $foo は integer です (11)
-$foo = "10.0 pigs " + 1; // $foo は integer です (11)
-$foo = "10.0 pigs " + 1.0; // $foo は float です (11)
-?>
-]]>
- </programlisting>
- </informalexample>
-
- <simpara>
- この変換に関する詳細は、Unix のマニュアルページで
- strtod(3) を参照ください。
- </simpara>
-
- <para>
- 本節の例を試したい場合、その例をカットアンドペーストしてから
- 動作を確認するために次の行を挿入してください。
- </para>
-
- <informalexample>
- <programlisting role="php">
-<![CDATA[
-<?php
-echo "\$foo==$foo; type is " . gettype ($foo) . "<br />\n";
-?>
-]]>
- </programlisting>
- </informalexample>
-
- <para>
- (C 言語で行われるように) 数値に変換することで
- 一つの文字のコードを取得できると期待してはいけません。
- 文字と文字コードを相互に変換するには <function>ord</function>
- および <function>chr</function> 関数を使用してください。
- </para>
-
- </sect2>
-
<sect2 xml:id="language.types.string.details">
<title>文字列型の詳細</title>
Modified: phpdoc/ja/trunk/language/types/type-juggling.xml
===================================================================
--- phpdoc/ja/trunk/language/types/type-juggling.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/types/type-juggling.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351133 Maintainer: takagi Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<sect1 xml:id="language.types.type-juggling">
<title>型の相互変換</title>
@@ -59,8 +59,8 @@
<simpara>
最後の二つの例が奇妙に思える場合には、
- <link linkend="language.types.string.conversion">文字列変換</link>
- を参照ください。
+ <link linkend="language.types.numeric-strings">数値文字列</link>
+ がどのようにして数値に変換されるかを見て下さい。
</simpara>
<simpara>
Modified: phpdoc/ja/trunk/language/types.xml
===================================================================
--- phpdoc/ja/trunk/language/types.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/language/types.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 351365 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi,shimooka,mumumu -->
<chapter xml:id="language.types" xmlns="http://docbook.org/ns/docbook">
<title>型</title>
@@ -190,6 +190,7 @@
&language.types.integer;
&language.types.float;
&language.types.string;
+ &language.types.numeric-strings;
&language.types.array;
&language.types.iterable;
&language.types.object;
Modified: phpdoc/ja/trunk/reference/math/functions/round.xml
===================================================================
--- phpdoc/ja/trunk/reference/math/functions/round.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/reference/math/functions/round.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 350654 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi,mumumu -->
<refentry xml:id="function.round" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
@@ -37,16 +37,6 @@
</caution>
</para>
-->
- <para>
- <note>
- <simpara>
- PHP は、デフォルトでは <literal>"12,300.2"</literal> のような
- 文字列を正しく処理しません。<link
- linkend="language.types.string.conversion">文字列からの変換
- </link>を参照ください。
- </simpara>
- </note>
- </para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
Modified: phpdoc/ja/trunk/reference/var/functions/is-numeric.xml
===================================================================
--- phpdoc/ja/trunk/reference/var/functions/is-numeric.xml 2020-11-27 21:12:44 UTC (rev 351707)
+++ phpdoc/ja/trunk/reference/var/functions/is-numeric.xml 2020-11-27 21:13:36 UTC (rev 351708)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 349477 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 351700 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi,mumumu -->
<refentry xml:id="function.is-numeric" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
@@ -17,12 +17,8 @@
<methodparam><type>mixed</type><parameter>var</parameter></methodparam>
</methodsynopsis>
<para>
- 指定した変数が数値であるかどうかを調べます。数値形式の文字列は以下の要素から
- なります。(オプションの)ホワイトスペース、(オプションの)符号、任意の数の数字、(オプションの)小数部、
- そして(オプションの)指数部。つまり、<literal>+0123.45e6</literal>
- は数値として有効な値です。十六進表記(<literal>0xf4c3b00c</literal> など)
- や二進表記 (<literal>0b10100111001</literal> など)
- は認められません。
+ 指定した変数が数値または
+ <link linkend="language.types.numeric-strings">数値文字列</link>であるかどうかを調べます。
</para>
</refsect1>
@@ -45,7 +41,9 @@
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
- <parameter>var</parameter> が数値または数値形式の文字列である場合に
+ <parameter>var</parameter> が数値または
+ <link linkend="language.types.numeric-strings">数値文字列</link>
+ である場合に
&true;、それ以外の場合に &false; を返します。
</para>
</refsect1>
@@ -109,35 +107,11 @@
</para>
</refsect1>
- <refsect1 role="changelog"><!-- {{{ -->
- &reftitle.changelog;
- <para>
- <informaltable>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>&Version;</entry>
- <entry>&Description;</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>7.0.0</entry>
- <entry>
- 十六進表記(<literal>0xf4c3b00c</literal> など) の文字列は数値形式の文字列とみなされなくなりました。
- つまり、<function>is_numeric</function> は &false; を返すようになりました。
- </entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </refsect1><!-- }}} -->
-
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
+ <member><link linkend="language.types.numeric-strings">数値文字列</link></member>
<member><function>ctype_digit</function></member>
<member><function>is_bool</function></member>
<member><function>is_null</function></member>