<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Paradigm on よ〜んの雑記</title><link>https://mu7889yoon.github.io/tags/paradigm/</link><description>Recent content in Paradigm on よ〜んの雑記</description><generator>Hugo</generator><language>ja-jp</language><lastBuildDate>Wed, 17 Jun 2026 19:06:52 +0900</lastBuildDate><atom:link href="https://mu7889yoon.github.io/tags/paradigm/index.xml" rel="self" type="application/rss+xml"/><item><title>PHPでパイプ演算子が使えるらしいので、深掘りしてみる。</title><link>https://mu7889yoon.github.io/posts/pipe-operator-is-now-available-in-php/</link><pubDate>Wed, 17 Jun 2026 19:06:52 +0900</pubDate><guid>https://mu7889yoon.github.io/posts/pipe-operator-is-now-available-in-php/</guid><description>&lt;p&gt;学生の頃に Elixir を少し触っていたので、PHPに&lt;a href="https://www.php.net/manual/ja/language.operators.functional.php"&gt;パイプ演算子&lt;/a&gt; が入ると聞いてテンションが上がっている、よ〜んです。&lt;/p&gt;
&lt;p&gt;パイプ演算子ってこんなやつです↓&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-elixir" data-lang="elixir"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; PHP 8.5 Released &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;slug &lt;span style="color:#f92672"&gt;=&lt;/span&gt; title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;trim()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;downcase()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;String&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;replace(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;IO&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;puts(slug)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ネストした関数呼び出しを内側から読んでいくのではなく、値が順番に加工されていく様子をそのままコードにできる。&lt;/p&gt;
&lt;p&gt;これが当時かなり衝撃でした。&lt;/p&gt;
&lt;p&gt;そして、ついに PHP でもパイプ演算子が使えるようになったようです！！！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「「「「「うれしい！！！」」」」」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ということで今回は、PHP のパイプ演算子について触りつつ、どんな場面で使えるのかを考えてみます。&lt;/p&gt;
&lt;p&gt;あと、せっかくなので構文木とかIR的にはどういう話なのかも見てみます。&lt;/p&gt;
&lt;h2 id="php-のパイプ演算子"&gt;PHP のパイプ演算子&lt;/h2&gt;
&lt;p&gt;パイプ演算子は、左辺の値を右辺の &lt;a href="https://www.php.net/manual/ja/language.types.callable.php"&gt;callable&lt;/a&gt; に渡すための演算子です。&lt;/p&gt;
&lt;p&gt;たとえば、次のような文字列を加工するコードがあるとします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; PHP 8.5 Released &amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$slug &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strtolower&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;str_replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;($title)));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt;($slug);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは処理の流れに合わせて読むと、内側から順番に追う必要があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trim
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;str_replace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;strtolower
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なのですが、コード的にはこう見えます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;strtolower&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;str_replace&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;($title)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際に最初に評価されるのは一番内側の &lt;code&gt;trim($title)&lt;/code&gt; です。&lt;/p&gt;
&lt;p&gt;今となっては慣れましたが、読む向きと処理の向きがズレています。&lt;/p&gt;
&lt;p&gt;最初に見たときはあまり直感的ではないなと思った部分です。&lt;/p&gt;
&lt;p&gt;パイプ演算子を使うと、これを値の流れに近い形で書けます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; PHP 8.5 Released &amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$slug &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $title
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;(&lt;span style="color:#f92672"&gt;...&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;string&lt;/span&gt; $value) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str_replace&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;, $value))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strtolower&lt;/span&gt;(&lt;span style="color:#f92672"&gt;...&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="木を見る"&gt;木を見る&lt;/h3&gt;
&lt;p&gt;構文木を全部出すと大変なので、この部分に注目して見てみます。&lt;/p&gt;</description></item></channel></rss>