<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.operators.functional.php',
    1 => 'パイプ演算子',
    2 => 'パイプ演算子',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => '演算子',
  ),
  'prev' => 
  array (
    0 => 'language.operators.type.php',
    1 => '型演算子',
  ),
  'next' => 
  array (
    0 => 'language.control-structures.php',
    1 => '制御構造',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/operators/functional.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.functional" class="sect1">
 <h2 class="title">パイプ演算子</h2>
 
 <p class="para">
  PHP 8.5 以降では、callable に直接値を渡す演算子をサポートしています。
  <code class="literal">|&gt;</code> 演算子、または &quot;パイプ&quot; は、右辺にパラメーターをひとつ取る
  callable を受け入れ、左辺値をそれに渡し、callable の結果を評価します。
  右辺の callable は、有効な PHP の callable であれば何でも構いません:
  つまり、<span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>、
  <a href="functions.first_class_callable_syntax.php" class="link">第一級callableを生成する記法</a>、
  <a href="language.oop5.magic.php#object.invoke" class="link">__invoke()</a> を実装したオブジェクトなどです。
 </p>
 <p class="para">
  論理的には同じ意味になる、2行のコードを以下に示します。
  <div class="example" id="example-1">
   <p><strong>例1 <code class="literal">|&gt;</code> を使う</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$result </span><span style="color: #007700">= </span><span style="color: #DD0000">"Hello World" </span><span style="color: #007700">|&gt; </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(...);<br />echo </span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #DD0000">"Hello World"</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
11
11
</pre></div>
   </div>
  </div>
 </p>
 <p class="para">
  単一の呼び出しは特に役に立ちませんが、
  複数の呼び出しを一緒にチェインさせると役に立ちます。
  たとえば、論理的には同じ意味になるコード片を2つ、以下に示します:
  <div class="example" id="example-2">
   <p><strong>例2 |&gt; の呼び出しをチェインさせる</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$result </span><span style="color: #007700">= </span><span style="color: #DD0000">"PHP Rocks"<br />    </span><span style="color: #007700">|&gt; </span><span style="color: #0000BB">htmlentities</span><span style="color: #007700">(...)<br />    |&gt; </span><span style="color: #0000BB">str_split</span><span style="color: #007700">(...)<br />    |&gt; (fn(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(...), </span><span style="color: #0000BB">$x</span><span style="color: #007700">))<br />    |&gt; (fn(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">array_filter</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">, fn(</span><span style="color: #0000BB">$v</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$v </span><span style="color: #007700">!= </span><span style="color: #DD0000">'O'</span><span style="color: #007700">))<br />;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$temp </span><span style="color: #007700">= </span><span style="color: #DD0000">"PHP Rocks"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$temp </span><span style="color: #007700">= </span><span style="color: #0000BB">htmlentities</span><span style="color: #007700">(</span><span style="color: #0000BB">$temp</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$temp </span><span style="color: #007700">= </span><span style="color: #0000BB">str_split</span><span style="color: #007700">(</span><span style="color: #0000BB">$temp</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$temp </span><span style="color: #007700">= </span><span style="color: #0000BB">array_map</span><span style="color: #007700">(</span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(...), </span><span style="color: #0000BB">$temp</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$temp </span><span style="color: #007700">= </span><span style="color: #0000BB">array_filter</span><span style="color: #007700">(</span><span style="color: #0000BB">$temp</span><span style="color: #007700">, fn(</span><span style="color: #0000BB">$v</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$v </span><span style="color: #007700">!= </span><span style="color: #DD0000">'O'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$temp</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>上の例の出力は以下となります。</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
Array
(
    [0] =&gt; P
    [1] =&gt; H
    [2] =&gt; P
    [3] =&gt;
    [4] =&gt; R
    [6] =&gt; C
    [7] =&gt; K
    [8] =&gt; S
)
Array
(
    [0] =&gt; P
    [1] =&gt; H
    [2] =&gt; P
    [3] =&gt;
    [4] =&gt; R
    [6] =&gt; C
    [7] =&gt; K
    [8] =&gt; S
)
</pre></div>
   </div>
  </div>
 </p>
 <p class="para">
  パイプの左側は、値や式であれば何でも構いません。
  パイプの右側は、パラメーターをひとつ取る PHP の有効な callable か、
  そのように評価できる任意の式であれば何でも構いません。
  必須のパラメーターをひとつ以上とる関数を右側に指定した場合、
  それは許可されず、
  引数が不足した状態で関数をコールしたかのように失敗します。
  リファレンスの値を取る関数も許可されていません。
  右辺が有効な callable として評価されない場合、Error がスローされます。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   上の例で示したとおり、文法的な曖昧さを回避するため、
   <a href="functions.arrow.php" class="link">アロー関数</a> は、
   パイプ演算子と一緒に使う場合に括弧で囲わなければならない点に注意してください。
   そうしない場合、致命的なエラーが発生します。
  </p>
 </p></blockquote>

 <div class="sect2">
  <h3 class="title">参考</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="classname"><a href="class.closure.php" class="classname">Closure</a></span></li>
   </ul>
  </p>
 </div>
</div><?php manual_footer($setup); ?>