【クソアプリ】PHP関数名しりとり

# PHPの関数名でしりとりができると思うんだ

PHP関数名しりとりとは、**交互にPHPの関数名を言い合うしりとりゲーム**です。

プレイヤーは最後のアルファベットから始まる関数名を考えて、フォームに入力してください。
降参したり、"md5"のように数字で終わる関数名を言ったほうが負けです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/fe30724f-8f67-80aa-3c15-6c60b8195124.png)

# 作ったもの

PHP関数名しりとり
https://functori.netlify.app

# 説明

**PHP**という言語をご存じでしょうか。そう、PHPとは子供から大人までみんな大好きなプログラミング言語のことです。
[PHP: PHP とはなんでしょう? - Manual](https://www.php.net/manual/ja/intro-whatis.php)

PHPにはある特徴があります。それは、**恐ろしいほどデフォルトで使える関数が多い**こと。

突然ですがここで問題です。

PHPマニュアルに書かれている関数、メソッドは全部でいくつあるでしょうか。

1. 約200個
2. 約500個
3. 約1000個
4. 約4000個

ヒント︰Pythonの組み込み関数は69個です。

↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓

正解は……　~~5の~~ **約9000個** でした！

PHPマニュアルから数えたところ、PHPには9304個もの関数・メソッドが存在しているようです。
もちろん、全部使えるわけではなく、別の関数のエイリアス(別名)であったり、ただ引数のリストのみがマニュアルに記されている関数もあります。とはいえ、他に類を見ない多さであることには間違いないでしょう。

**これだけ数があるなら、しりとりができますね。**

# ルールについて

日本語のしりとりと同じように、関数の後ろの文字と最初の文字が繋がるようにしていきます。ただし、数字から始まる関数はありませんから、数字で終わる関数を出してはいけません。「ん」と同じです。

出せるものが無くなったら降参して負けになります。

意外と覚えてたりするので[要出典]、記憶力の限界に試してみるのもよし、検索でズルしつつ本気でCPUに勝ちに行くのもよし、CPUが出してきた珍しい関数名をクリックしてPHPマニュアルで使われ方を眺めてみるのもよし（**吹き出しの下側をクリックするとその関数のマニュアルに飛べます**）、色々な楽しみ方があるんじゃないかと思っています。

![0489ACA1-C0F0-4AF9-AEA7-607CAACCEA01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218499/14218738-6300-bf0c-43a0-9dfc668c06ac.png)

(追記)
意外と苦戦している人が多かったので、PHPの全関数名の一覧を置いておきます。

マニュアル内の全関数およびメソッドの一覧
https://www.php.net/manual/ja/indexes.functions.php

（ちなみにCPUは即レスかつチートスキルの持ち主なので負けてもあまり気にしないでください…！）

# 構成

これまでLAMPサーバにFTPでファイルを直接上書きして、生PHPと生jsで頑張るような開発生活をしてきましたが、そろそろモダンな世界が見てみたくなったので、React + Tailwind CSS + Netlifyでリリースすることにしました。
Sassも使える状態にはしましたが、Tailwind CSSで事足りたので使っていません。

## Reactの感想

素晴らしかったです。リピート確定です。かなり複雑な処理を書いたはずですが、App.jsの中身は200行足らずで完成して満足しています。

若干難しかったのは、値の保持、受け渡しです。React Hooksのおかげで面倒くさそうなクラスは書かずに済みましたが、値の保持、受け渡しの流れについてはよく理解できず、時間がかかりました。
例えば`useState()`を使うと`count`と`setCount()`が使えるようになるのですが、`setCount()`を連続で使うと変更が反映されません。そもそもそういう使い方はReactドキュメントでも非推奨なのだろうと思いますが、他にどう書けば…となったり…。

## Tailwind CSSの感想

これまで書いてきたCSSのショートハンドという印象です。[Tailwind CSS Cheat Sheet](https://nerdcave.com/tailwind-cheat-sheet)には本当にお世話になりました。ごってり独特のスタイルが付いたようなフレームワークではないのですごく便利です。特にReactではJSXの中でclassを付けたり外したりして動的にスタイルを操作できるのでありがたいです。
色数は特に色相が少なく不便に感じることもありますが、概ね満足です。色の意思決定を減らすことができるというのは想像以上に便利です。
あとTailwindくんだけで大体のCSSは再現できるので、上にも書いた通りSassくんの出番はありませんでした。

## Netlifyの感想

今回初めて使いましたが、UIも良く使いやすい印象でした。静的ホストだと認識していますが、ルーティングもできるようなので、Reactにはうってつけといった印象です。

## React Hook Formの感想

今回はフォームの入力を扱うために、[React Hook Form](https://react-hook-form.com/jp/)というライブラリを使いました。
Reactの性質上フォームは扱いにくいと思っているので、Reactで頑張るよりはこっちを使ったほうがましかな、という感じでした。少しギミックの多いUIにしてしまったので、実装が結構思い通りに行かず大変でした。jsで直接フォーム弄りたいよう～～～

# 書いたもの

GitHubに置いてあります。
https://github.com/namosuke/functori

(追記)
あっ！あと！！PHP題材にしてるくせに！PHP使ってねーじゃんとか！思ってるでしょ！
使ってるんだよなぁ～？ということで、アプリ上には置いてありませんが、関数名の一覧データを生成するときに使ったPHPのコードを置いておきます。

```php:regex.php
<?php
$raw = file_get_contents('https://www.php.net/manual/ja/indexes.functions.php');
preg_match_all('/<a href="(.+?)" class="index">(.+?)<\/a> - (.+?)<\/li>/', $raw, $output_array);
foreach ($output_array[2] as $key => $value) {
	$name = strtolower(preg_replace('/[^0-9a-zA-Z]/', '', $value));
	$array[$name] = [$value, $output_array[1][$key], $output_array[3][$key]];
}
$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
file_put_contents('regex.json', $json);

```

---

というわけで、頑張って作ったので「[PHP関数名しりとり](https://functori.netlify.app)」の皆さんの挑戦を待っています！
結果はTwitterのハッシュタグ「[#PHP関数名しりとり](https://twitter.com/search?q=%23PHP関数名しりとり&src=typed_query&f=live)」で共有してくださるとうれしいです！
見たことのない関数にであったり、PHPに興味を持ってもらうきっかけにもなったらいいなと思っています。

PHP関数名しりとり
https://functori.netlify.app

最後に、この記事及びサービスは「[クソアプリ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kuso-app)」8日目のために制作しました。
特に誰の役にも立たない、クソアプリとして絶妙な仕上がりになったのではないかと思います。
ご覧いただきありがとうございました。