svn: /phpdoc/ja/trunk/language/ control-structures/match.xml control-structures.xml errors/php7.xml predefined/exceptions.xml predefined/unhandledmatcherror.xml
[email protected] (Yoshinari Takaoka)
| Newsgroups | php.doc.ja |
|---|---|
| Message-ID | <[email protected]> |
mumumu Mon, 23 Nov 2020 00:10:25 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=351511 Log: Add match expression documentation This includes: - match expression page - UnhandledMatchError page Co-authored-by: Larry Garfield <[email protected]> Changed paths: A phpdoc/ja/trunk/language/control-structures/match.xml U phpdoc/ja/trunk/language/control-structures.xml U phpdoc/ja/trunk/language/errors/php7.xml U phpdoc/ja/trunk/language/predefined/exceptions.xml A phpdoc/ja/trunk/language/predefined/unhandledmatcherror.xml
svn-diffs-351511.txt
(text/x-diff, 13 KB)
Added: phpdoc/ja/trunk/language/control-structures/match.xml
===================================================================
--- phpdoc/ja/trunk/language/control-structures/match.xml (rev 0)
+++ phpdoc/ja/trunk/language/control-structures/match.xml 2020-11-23 00:10:25 UTC (rev 351511)
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 351499 Maintainer: mumumu Status: ready -->
+
+<sect1 xml:id="control-structures.match" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title><literal>match</literal></title>
+ <?phpdoc print-version-for="match"?>
+ <para>
+ <literal>match</literal> 式は、値の一致をチェックした結果に基づいて評価結果を分岐します。
+ <literal>switch</literal> 文と似ていますが、
+ <literal>match</literal> 式は複数の候補と比較される制約式を持ちます。
+ <literal>switch</literal> 文とは異なり、
+ 三項演算子のように値を評価します。
+ <literal>switch</literal> 文とは異なり、
+ 弱い比較(<code>==</code>)ではなく、
+ 型と値の一致チェック(<code>===</code>) に基づいて行われます。
+ match 式は PHP 8.0.0 以降で利用可能です。
+ </para>
+
+ <example>
+ <title><literal>match</literal> 式の構造</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$return_value = match (制約式) {
+ 単一の条件式 => 返却式,
+ 条件式1, 条件式2 => 返却式,
+};
+?>
+]]>
+ </programlisting>
+
+ <note>
+ <simpara>
+ <literal>match</literal> 式の結果は、必ずしも使う必要はありません。
+ </simpara>
+ </note>
+ <note>
+ <simpara>
+ <literal>match</literal> 式は、必ずセミコロン <literal>;</literal> で終わらなければなりません。
+ </simpara>
+ </note>
+ </example>
+
+ <para>
+ <literal>match</literal> 式は、
+ <literal>switch</literal> 文と似ていますが、いくつかの違いがあります:
+
+ <itemizedlist>
+ <listitem>
+ <simpara>
+ <literal>match</literal> 式の比較は、
+ switch 文が行う弱い比較ではなく、
+ 厳密に値を比較(<code>===</code>) します。
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <literal>match</literal> 式は値を返します。
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <literal>match</literal> 式の分岐は、
+ <literal>switch</literal> 文のように後の分岐に抜けたりはしません。
+ </simpara>
+ </listitem>
+ <listitem>
+ <simpara>
+ <literal>match</literal> 式は、全ての場合を網羅していなければいけません。
+ </simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ <literal>switch</literal> 文のように、
+ <literal>match</literal> 式はマッチさせる分岐をひとつひとつ実行します。
+ はじめは、コードは何も実行されません。
+ 以前のすべての条件式が、制約式とマッチしなかった場合に条件式が実行されます。
+ 条件式に一致する式が評価された場合に、返却式が評価されます。
+ たとえば、以下のようになります:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$result = match ($x) {
+ foo() => ...,
+ $this->bar() => ..., // foo() === $x でなければ bar() は呼び出されません。
+ $this->baz => beep(), // $x === $this->baz でなければ、beep() は呼び出されません。
+ // などなど
+};
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+
+ <para>
+ <literal>match</literal> 式の分岐は、複数の式をカンマ区切りで含めても構いません。
+ これは論理ORであり、複数の分岐の右辺を同じにする場合の短縮記法です。
+ </para>
+ <para>
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$result = match ($x) {
+ // この分岐は:
+ $a, $b, $c => 5,
+ // 以下の3つの分岐と等しい:
+ $a => 5,
+ $b => 5,
+ $c => 5,
+};
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ <literal>default</literal> パターンという特別な場合があります。
+ このパターンは前の分岐にマッチしなかったあらゆる場合にマッチします。
+ たとえば、以下のようになります:
+ <informalexample>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$expressionResult = match ($condition) {
+ 1, 2 => foo(),
+ 3, 4 => bar(),
+ default => baz(),
+};
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ <note>
+ <simpara>
+ 複数の <literal>default</literal> パターンがあった場合、
+ <constant>E_FATAL_ERROR</constant> が発生します。
+ </simpara>
+ </note>
+ </para>
+
+ <para>
+ <literal>match</literal> 式は、全ての場合を網羅していなければいけません。
+ 制約式がどの分岐でも処理できなかった場合、
+ <classname>UnhandledMatchError</classname> がスローされます。
+
+ </para>
+
+ <example>
+ <title>処理されない match 式の例</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$condition = 5;
+
+try {
+ match ($condition) {
+ 1, 2 => foo(),
+ 3, 4 => bar(),
+ };
+} catch (\UnhandledMatchError $e) {
+ var_dump($e);
+}
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+object(UnhandledMatchError)#1 (7) {
+ ["message":protected]=>
+ string(33) "Unhandled match value of type int"
+ ["string":"Error":private]=>
+ string(0) ""
+ ["code":protected]=>
+ int(0)
+ ["file":protected]=>
+ string(9) "/in/ICgGK"
+ ["line":protected]=>
+ int(6)
+ ["trace":"Error":private]=>
+ array(0) {
+ }
+ ["previous":"Error":private]=>
+ NULL
+}
+]]>
+ </screen>
+ </example>
+
+ <sect2>
+ <title>厳密な一致チェックを行わずに match 式を使う</title>
+ <para>
+ 制約式に <code>true</code> を指定することで、
+ 厳密な一致チェックを行わずに <literal>match</literal> 式を使うことができます。
+ </para>
+
+ <example>
+ <title>整数の範囲の応じてmatch式を分岐させる一般的な使い方</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+$age = 23;
+
+$result = match (true) {
+ $age >= 65 => 'senior',
+ $age >= 25 => 'adult',
+ $age >= 18 => 'young adult',
+ default => 'kid',
+}
+
+var_dump($result);
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+string(11) "young adult"
+]]>
+ </screen>
+ </example>
+
+ <example>
+ <title>文字列の内容に応じてmatch式を分岐させる一般的な使い方</title>
+ <programlisting role="php">
+<![CDATA[
+<?php
+
+$text = 'Bienvenue chez nous';
+
+$result = match (true) {
+ str_contains($text, 'Welcome') || str_contains($text, 'Hello') => 'en',
+ str_contains($text, 'Bienvenue') || str_contains($text, 'Bonjour') => 'fr',
+ // ...
+};
+
+var_dump($result);
+?>
+]]>
+ </programlisting>
+ &example.outputs;
+ <screen>
+<![CDATA[
+string(2) "fr"
+]]>
+ </screen>
+ </example>
+ </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/control-structures/match.xml
___________________________________________________________________
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/control-structures.xml
===================================================================
--- phpdoc/ja/trunk/language/control-structures.xml 2020-11-22 23:49:25 UTC (rev 351510)
+++ phpdoc/ja/trunk/language/control-structures.xml 2020-11-23 00:10:25 UTC (rev 351511)
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: 349319 Maintainer: hirokawa Status: ready -->
+<!-- EN-Revision: 351499 Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi,shimooka,mumumu -->
<chapter xml:id="language.control-structures" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>制御構造</title>
@@ -45,6 +45,7 @@
&language.control-structures.break;
&language.control-structures.continue;
&language.control-structures.switch;
+ &language.control-structures.match;
&language.control-structures.declare;
&language.control-structures.return;
&language.control-structures.require;
Modified: phpdoc/ja/trunk/language/errors/php7.xml
===================================================================
--- phpdoc/ja/trunk/language/errors/php7.xml 2020-11-22 23:49:25 UTC (rev 351510)
+++ phpdoc/ja/trunk/language/errors/php7.xml 2020-11-23 00:10:25 UTC (rev 351511)
@@ -74,6 +74,9 @@
<listitem>
<simpara><classname>ValueError</classname></simpara>
</listitem>
+ <listitem>
+ <simpara><classname>UnhandledMatchError</classname></simpara>
+ </listitem>
</itemizedlist>
</listitem>
<listitem>
Modified: phpdoc/ja/trunk/language/predefined/exceptions.xml
===================================================================
--- phpdoc/ja/trunk/language/predefined/exceptions.xml 2020-11-22 23:49:25 UTC (rev 351510)
+++ phpdoc/ja/trunk/language/predefined/exceptions.xml 2020-11-23 00:10:25 UTC (rev 351511)
@@ -26,6 +26,7 @@
&language.predefined.parseerror;
&language.predefined.typeerror;
&language.predefined.valueerror;
+ &language.predefined.unhandledmatcherror;
</part>
<!-- Keep this comment at the end of the file
Added: phpdoc/ja/trunk/language/predefined/unhandledmatcherror.xml
===================================================================
--- phpdoc/ja/trunk/language/predefined/unhandledmatcherror.xml (rev 0)
+++ phpdoc/ja/trunk/language/predefined/unhandledmatcherror.xml 2020-11-23 00:10:25 UTC (rev 351511)
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision$ -->
+<!-- EN-Revision: 351499 Maintainer: mumumu Status: ready -->
+
+<phpdoc:exceptionref xml:id="class.unhandledmatcherror"
+ xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:phpdoc="http://php.net/ns/phpdoc">
+ <title>UnhandledMatchError</title>
+ <titleabbrev>UnhandledMatchError</titleabbrev>
+
+ <partintro>
+
+<!-- {{{ Error intro -->
+ <section xml:id="unhandledmatcherror.intro">
+ &reftitle.intro;
+ <para>
+ <ooclass><classname>UnhandledMatchError</classname></ooclass> は、
+ match 式がどの分岐でも処理できなかったことを検知した場合にスローされます。
+ </para>
+ </section>
+<!-- }}} -->
+
+ <section xml:id="unhandledmatcherror.synopsis">
+ &reftitle.classsynopsis;
+
+<!-- {{{ Synopsis -->
+ <classsynopsis>
+ <ooclass><classname>UnhandledMatchError</classname></ooclass>
+
+<!-- {{{ Class synopsis -->
+ <classsynopsisinfo>
+ <ooclass>
+ <classname>UnhandledMatchError</classname>
+ </ooclass>
+
+ <ooclass>
+ <modifier>extends</modifier>
+ <classname>Error</classname>
+ </ooclass>
+ </classsynopsisinfo>
+<!-- }}} -->
+
+ <classsynopsisinfo role="comment">&InheritedProperties;</classsynopsisinfo>
+ <xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='&Properties;']]))">
+ <xi:fallback />
+ </xi:include>
+
+ <classsynopsisinfo role="comment">&InheritedMethods;</classsynopsisinfo>
+ <xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.error')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[1])" />
+ </classsynopsis>
+
+<!-- }}} -->
+
+ </section>
+ </partintro>
+</phpdoc:exceptionref>
+
+<!-- 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/predefined/unhandledmatcherror.xml
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
\ No newline at end of property