diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-01 02:28:10 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-01 02:28:10 +0900 |
| commit | cd16ed5d6b46d91ae9ac7b2237d6405ad6715a4a (patch) | |
| tree | 0e00d7caf3031fa86decaa0cbc226cc1e521b914 /services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html | |
| parent | d08e3edb65b215152aa26e3518fb2f2cd7071c4b (diff) | |
| parent | 1964f77d03eb647dcf46d63dde68d7ae7301604f (diff) | |
| download | nsfisis.dev-cd16ed5d6b46d91ae9ac7b2237d6405ad6715a4a.tar.gz nsfisis.dev-cd16ed5d6b46d91ae9ac7b2237d6405ad6715a4a.tar.zst nsfisis.dev-cd16ed5d6b46d91ae9ac7b2237d6405ad6715a4a.zip | |
Merge branch 'feat/ruby-rewrite'
Diffstat (limited to 'services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html')
| -rw-r--r-- | services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html | 331 |
1 files changed, 169 insertions, 162 deletions
diff --git a/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html b/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html index 3c9f1e60..4937deb0 100644 --- a/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html +++ b/services/nuldoc/public/blog/posts/2023-01-10/phperkaigi-2023-unused-token-quiz-3/index.html @@ -121,118 +121,119 @@ 注意: これはボツ問なので、得られたトークンを PHPerKaigi で入力してもポイントにはならない。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"><span style="color:#D73A49">try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#6F42C1"> f</span><span style="color:#24292E">(</span><span style="color:#6F42C1">g</span><span style="color:#24292E">() </span><span style="color:#D73A49">/</span><span style="color:#005CC5"> __LINE__</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E">} </span><span style="color:#D73A49">catch</span><span style="color:#24292E"> (</span><span style="color:#005CC5">Throwable</span><span style="color:#24292E"> $e) {</span></span> -<span class="line"><span style="color:#D73A49"> while</span><span style="color:#24292E"> ($e </span><span style="color:#D73A49">=</span><span style="color:#24292E"> $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getPrevious</span><span style="color:#24292E">()) </span><span style="color:#005CC5">printf</span><span style="color:#24292E">(</span><span style="color:#032F62">'%c'</span><span style="color:#24292E">, $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getLine</span><span style="color:#24292E">() </span><span style="color:#D73A49">+</span><span style="color:#005CC5"> 23</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#005CC5"> echo</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">}</span></span> -<span class="line"><span style="color:#D73A49">function</span><span style="color:#6F42C1"> f</span><span style="color:#24292E">(</span><span style="color:#D73A49">int</span><span style="color:#24292E"> $i) {</span></span> -<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49"><</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">) </span><span style="color:#6F42C1">f</span><span style="color:#24292E">();</span></span> -<span class="line"><span style="color:#D73A49"> try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#D73A49"> match</span><span style="color:#24292E"> ($i) {</span></span> -<span class="line"><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 15</span><span style="color:#24292E">, </span><span style="color:#005CC5">36</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 14</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 37</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 6</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 5</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 22</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 34</span><span style="color:#24292E">, </span><span style="color:#005CC5">35</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 25</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 17</span><span style="color:#24292E">, </span><span style="color:#005CC5">21</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 24</span><span style="color:#24292E">, </span><span style="color:#005CC5">32</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 33</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 16</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 18</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 7</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 2</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 1</span><span style="color:#24292E">, </span><span style="color:#005CC5">20</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 10</span><span style="color:#24292E">, </span><span style="color:#005CC5">28</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 8</span><span style="color:#24292E">, </span><span style="color:#005CC5">12</span><span style="color:#24292E">, </span><span style="color:#005CC5">26</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 4</span><span style="color:#24292E">, </span><span style="color:#005CC5">9</span><span style="color:#24292E">, </span><span style="color:#005CC5">13</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 31</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 29</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 11</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 3</span><span style="color:#24292E">, </span><span style="color:#005CC5">19</span><span style="color:#24292E">, </span><span style="color:#005CC5">23</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 27</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 30</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#24292E"> };</span></span> -<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">finally</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#6F42C1"> f</span><span style="color:#24292E">($i </span><span style="color:#D73A49">-</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E"> }</span></span> -<span class="line"><span style="color:#24292E">}</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#D73A49">function</span><span style="color:#6F42C1"> g</span><span style="color:#24292E">() {</span></span> -<span class="line"><span style="color:#D73A49"> return</span><span style="color:#005CC5"> __LINE__</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> +<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> + <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + + + + + + + <span style="color: #0550ae">6</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">5</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">22</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + <span style="color: #0550ae">34</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">35</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + + + + + <span style="color: #0550ae">25</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">17</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">21</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">24</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">32</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + + + + <span style="color: #0550ae">33</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">16</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + <span style="color: #0550ae">18</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + + + + + <span style="color: #0550ae">7</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">2</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">10</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">28</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">12</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">26</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">4</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">9</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">13</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + + + <span style="color: #0550ae">31</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">29</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">11</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + + <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">19</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">23</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + + <span style="color: #0550ae">27</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #24292f;background-color: #f6f8fa">};</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> + + + + + + + +<span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> “Catchline” と名付けた作品。実行するとトークン <code>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</code> が得られる。 @@ -266,20 +267,21 @@ このうち 1つ目のケースは、 <code>finally</code> 節の中でエラーを投げると PHP 処理系が勝手に <code>$previous</code> を設定してくれる。 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"></span> -<span class="line"><span style="color:#D73A49">try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#D73A49"> try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#D73A49"> throw</span><span style="color:#D73A49"> new</span><span style="color:#005CC5"> Exception</span><span style="color:#24292E">(</span><span style="color:#032F62">"Error 1"</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">finally</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#D73A49"> throw</span><span style="color:#D73A49"> new</span><span style="color:#005CC5"> Exception</span><span style="color:#24292E">(</span><span style="color:#032F62">"Error 2"</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E"> }</span></span> -<span class="line"><span style="color:#24292E">} </span><span style="color:#D73A49">catch</span><span style="color:#24292E"> (</span><span style="color:#005CC5">Exception</span><span style="color:#24292E"> $e) {</span></span> -<span class="line"><span style="color:#005CC5"> echo</span><span style="color:#24292E"> $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getMessage</span><span style="color:#24292E">() </span><span style="color:#D73A49">.</span><span style="color:#005CC5"> PHP_EOL</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#6A737D"> // => Error 2</span></span> -<span class="line"><span style="color:#005CC5"> echo</span><span style="color:#24292E"> $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getPrevious</span><span style="color:#24292E">()</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getMessage</span><span style="color:#24292E">() </span><span style="color:#D73A49">.</span><span style="color:#005CC5"> PHP_EOL</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#6A737D"> // => Error 1</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> + +<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 1"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">throw</span> <span style="color: #cf222e">new</span> <span style="color: #953800">Exception</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"Error 2"</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Exception</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> + <span style="color: #6e7781">// => Error 2</span> + <span style="color: #cf222e">echo</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">()</span><span style="color: #0550ae">-></span><span style="color: #8250df">getMessage</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">.</span> <span style="color: #0550ae">PHP_EOL</span><span style="color: #24292f;background-color: #f6f8fa">;</span> + <span style="color: #6e7781">// => Error 1</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> この知識を元に、トークンの出力部を解析してみる。 @@ -291,15 +293,16 @@ 出力部をコメントや改行を追加して再掲する: </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"><span style="color:#D73A49">try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#6F42C1"> f</span><span style="color:#24292E">(</span><span style="color:#6F42C1">g</span><span style="color:#24292E">() </span><span style="color:#D73A49">/</span><span style="color:#005CC5"> __LINE__</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E">} </span><span style="color:#D73A49">catch</span><span style="color:#24292E"> (</span><span style="color:#005CC5">Throwable</span><span style="color:#24292E"> $e) {</span></span> -<span class="line"><span style="color:#D73A49"> while</span><span style="color:#24292E"> ($e </span><span style="color:#D73A49">=</span><span style="color:#24292E"> $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getPrevious</span><span style="color:#24292E">()) {</span></span> -<span class="line"><span style="color:#005CC5"> printf</span><span style="color:#24292E">(</span><span style="color:#032F62">'%c'</span><span style="color:#24292E">, $e</span><span style="color:#D73A49">-></span><span style="color:#6F42C1">getLine</span><span style="color:#24292E">() </span><span style="color:#D73A49">+</span><span style="color:#005CC5"> 23</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E"> }</span></span> -<span class="line"><span style="color:#005CC5"> echo</span><span style="color:#032F62"> "</span><span style="color:#005CC5">\n</span><span style="color:#032F62">"</span><span style="color:#24292E">;</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> +<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">catch</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Throwable</span> <span style="color: #0550ae">$e</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">while</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$e</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getPrevious</span><span style="color: #24292f;background-color: #f6f8fa">())</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">'%c'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">$e</span><span style="color: #0550ae">-></span><span style="color: #8250df">getLine</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">+</span> <span style="color: #0550ae">23</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> + <span style="color: #cf222e">echo</span> <span style="color: #0a3069">"</span><span style="color: #0a3069">\n</span><span style="color: #0a3069">"</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> 出力をおこなう <code>catch</code> 節を見てみると、 <code>Throwable::getPrevious()</code> を呼び出してエラーチェインを辿り、 <code>Throwable::getLine()</code> でエラーが発生した行数を取得している。その行数に <code>23</code> なるマジックナンバーを足し、フォーマット指定子 <code>%c</code> で出力している。 @@ -308,7 +311,8 @@ フォーマット指定子 <code>%c</code> は、整数を ASCII コード<sup class="footnote"><a class="footnote" href="#footnote--ras-syndrome" id="footnoteref--ras-syndrome">[1]</a></sup> と見做して印字する。トークン <code>#base64_decode('SGVsbG8sIFdvcmxkIQ==')</code> の <code>b</code> であれば、ASCII コード <code>98</code> なので、75 行目で発生したエラー、 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#005CC5">1</span><span style="color:#24292E">, </span><span style="color:#005CC5">20</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">20</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</code></pre> </div> <p> によって表現されている。エラーを起こす方法はいろいろと考えられるが、今回はゼロ除算を使った。 @@ -323,39 +327,42 @@ <code>f()</code> の定義を再掲する (エラーオブジェクトの行数を利用しているので、一部分だけ抜き出すと値が変わることに注意): </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">function</span><span style="color:#6F42C1"> f</span><span style="color:#24292E">(</span><span style="color:#D73A49">int</span><span style="color:#24292E"> $i) {</span></span> -<span class="line"><span style="color:#D73A49"> if</span><span style="color:#24292E"> ($i </span><span style="color:#D73A49"><</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">) </span><span style="color:#6F42C1">f</span><span style="color:#24292E">();</span></span> -<span class="line"><span style="color:#D73A49"> try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#D73A49"> match</span><span style="color:#24292E"> ($i) {</span></span> -<span class="line"><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">, </span><span style="color:#6A737D">// 12 行目</span></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 15</span><span style="color:#24292E">, </span><span style="color:#005CC5">36</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 14</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"><span style="color:#005CC5"> 37</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">,</span></span> -<span class="line"></span> -<span class="line"><span style="color:#6A737D"> // (略)</span></span> -<span class="line"></span> -<span class="line"><span style="color:#005CC5"> 30</span><span style="color:#D73A49"> =></span><span style="color:#005CC5"> 0</span><span style="color:#D73A49"> /</span><span style="color:#005CC5"> 0</span><span style="color:#24292E">, </span><span style="color:#6A737D">// 97 行目</span></span> -<span class="line"><span style="color:#24292E"> };</span></span> -<span class="line"><span style="color:#24292E"> } </span><span style="color:#D73A49">finally</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#6F42C1"> f</span><span style="color:#24292E">($i </span><span style="color:#D73A49">-</span><span style="color:#005CC5"> 1</span><span style="color:#24292E">);</span></span> -<span class="line"><span style="color:#24292E"> }</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">int</span> <span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">();</span> + <span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">match</span> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #0550ae">0</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 12 行目</span> + + + + <span style="color: #0550ae">15</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">36</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">14</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + <span style="color: #0550ae">37</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> + + <span style="color: #6e7781">// (略)</span> + + <span style="color: #0550ae">30</span> <span style="color: #0550ae">=></span> <span style="color: #0550ae">0</span> <span style="color: #0550ae">/</span> <span style="color: #0550ae">0</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #6e7781">// 97 行目</span> + <span style="color: #24292f;background-color: #f6f8fa">};</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> <span style="color: #cf222e">finally</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">$i</span> <span style="color: #0550ae">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">);</span> + <span style="color: #24292f;background-color: #f6f8fa">}</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> 前述のように、 <code>finally</code> 節でエラーを投げると PHP 処理系が <code>$previous</code> を設定する。ここでは、エラーを繋げるために <code>f()</code> を再帰呼び出ししている。最初に <code>f()</code> を呼び出している箇所を確認すると、 </p> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49"><?</span><span style="color:#005CC5">php</span></span> -<span class="line"><span style="color:#D73A49">try</span><span style="color:#24292E"> {</span></span> -<span class="line"><span style="color:#6F42C1"> f</span><span style="color:#24292E">(</span><span style="color:#6F42C1">g</span><span style="color:#24292E">() </span><span style="color:#D73A49">/</span><span style="color:#005CC5"> __LINE__</span><span style="color:#24292E">); </span><span style="color:#6A737D">// 3 行目</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #6e7781"><?php</span> +<span style="color: #cf222e">try</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #0550ae">/</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">);</span> <span style="color: #6e7781">// 3 行目</span> +</code></pre> </div> <div class="codeblock"> - <pre class="shiki github-light" style="background-color:#f5f5f5;color:#24292e" tabindex="0"><code><span class="line"><span style="color:#D73A49">function</span><span style="color:#6F42C1"> g</span><span style="color:#24292E">() {</span></span> -<span class="line"><span style="color:#D73A49"> return</span><span style="color:#005CC5"> __LINE__</span><span style="color:#24292E">; </span><span style="color:#6A737D">// 111 行目</span></span> -<span class="line"><span style="color:#24292E">}</span></span></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span style="color: #cf222e">function</span> <span style="color: #24292f;background-color: #f6f8fa">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> + <span style="color: #cf222e">return</span> <span style="color: #cf222e">__LINE__</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// 111 行目</span> +<span style="color: #24292f;background-color: #f6f8fa">}</span> +</code></pre> </div> <p> <code>f()</code> には <code>111 / 3</code> で <code>37</code> が渡されることがわかる。そこから 1 ずつ減らして再帰呼び出ししていき、0 より小さくなったら <code>f()</code> を引数なしで呼び出す。引数の数が足りないと呼び出しに失敗するので、再帰はここで止まる。 |
