数年ぶりにPHPerへ復帰した浦島太郎がPHPerやPHPについて思うこと

PHPer(ペチパー)…その言葉の響きが悪いのかはたまた別の理由があるのか、自虐や蔑む時に使われる事も多い通り名？な気がします。そんなPHPerへ数年ぶりに復帰した自分が、PHPerやPHPについて感じたり思ったりしている事を適当に書いてみました。

このようなポエムに無駄な時間をとらせるのは申し訳ないので、はじめにお断りしておきますが、PHPerやPHPをディスる内容ではありません。また、略語が何の略であるかの説明は~~面倒くさいので~~一切していませんしリンクも張っていません。前後の文脈から判断するか、興味があればググってください。

--------------------------------------------------------------------------------

## 闇・陰・負

### register_globalsとmagic_quotes_gpc

PHPerなのにもしこれらの言葉を知らない人がいたら、それはとても幸せな事だと思います。最近のバージョンのPHPを使っているのであれば、今更こんなものを覚える必要性は全くありませんので、安心してください。

天下のIPA様をして、「セキュアなWebアプリを作るには、**[例えば、PHPを避ける](https://www.google.co.jp/search?q=%E4%BE%8B%E3%81%88%E3%81%B0%E3%80%81PHP%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B&ie=utf-8&oe=utf-8)**」とまで言わしめる要因となった機能ですが、両者共ほぼ同じタイミングで大昔に闇に葬り去られたものです。

```php
if (get_magic_quotes_gpc()) { }
```

…というコードを見て、「懐かしいなぁ…」と感じる~~おっさん~~PHPerもいらっしゃるのではないかと思います。

PHPを学び始めたばかりの頃の「CSRF？何それ美味いの？」レベルだった私にすら、これらの何が問題なのかはすぐに理解できる程の代物でした。

PHPからはとっくの昔に切り捨てられたものなのですが、IPA様の**「例えば、PHPを避ける」**のインパクトは強烈で、PHPに深く携わった事のない人には、未だにこの時代のイメージが強く残っているのかもしれません。

--------------------------------------------------------------------------------

### create_function()

PHPerなのにもしこの関数を知らない人がいたら、それはとても幸せな事だと思います。最近のバージョンのPHPを...(以下略)

「PHPってクロージャ使えないの！？」と昔はよくイジメられました。`create_function()`というものはありましたが、当時のそれは内部的には `\0lambda_` から始まるユーザー定義関数を作ってるだけみたいな感じで[^1]、クロージャとは似て非なるものでした。ちょっと言語オタクっぽい人からは、その事でもイジメられました。[^2]

[^1]: 今は実装方法が違うかもしれません。
[^2]: かなり誇張が入っています。

コードとしても読みやすいとはいい難く、コールバック専用の関数を別に定義したりした方が幾分マシでしたので、ほとんど使ったことが無かったです。

PHPで一番好きな標準関数は何？と聞かれたら、私の場合は `preg_replace_callback()` なのですが…[^3]

[^3]: Webアプリで使う事はあまりないですが、雑務でちょっとした文字列変換をしたい時に便利なのです。

```php
preg_replace_callback(
	'//u',
	function ($match) use ($i) {
		return;
	},
	$str
);
```

…こういう風に書けて、脳汁が出そうになります。

--------------------------------------------------------------------------------

### array()

PHPerなのにもしこの言語構造を知らない人が...(以下略)

さぁ！PHPで書くぞ！という時に、他言語から頭を切り替えるスイッチみたいな役目をしていたのがこれでした。それが癖になっていて、未だに手が勝手に動いてしまいますが…。

--------------------------------------------------------------------------------

### PEAR

PHPerなのにもしこの...と書こうとしたら「PHP The Right Way」にはまだその名が残っているようなので、今のPEARの扱いがどうなっているのかがイマイチよく分からなかったりします。

個人的には、PHP5のかなり初期の段階で見切りを付けた以降は、全く使っていませんでした。

--------------------------------------------------------------------------------

### WordPressその1

PHPerではない人でも名前ぐらいは知っているであろう、世界でも日本でも最も利用されている超有名CMSです。下位互換をとても大切にしているようで、かなり古いバージョンのPHPでも一応は動作します。

稀に致命的なセキュリティホールが見つかり、幾多のサーバー管理者を人知れず葬り去ってきた存在でもあります。その知名度の高さが故に、**「例えば、PHPを避ける」**とも相まって、PHPをディスる材料の代表格みたいな印象もあります。

そんなWordPressの最新バージョンのコードを眺めていると(読んではいません)、何となく見覚えのある古い実装やコードが色々と残っています。

ECプラットフォームでMagentoというものがあるのですが、そちらはもう気持ち良い程バッサバッサと下位互換を切り捨ててくる分、かなりモダンな作りになっています。そこまで極端ではなくても、WordPressももう少し下位互換を切り捨てれば良いような気もするのですが、ここまで広く使われていると難しい面も多々あるのでしょう。

--------------------------------------------------------------------------------

### WordPressその2

WordPressのテーマファイルは、こんな風になっています。

```html+php
<html <?php language_attributes(); ?>>
    <meta charset="<?php bloginfo( 'charset' ); ?>" >

        <?php if ( is_front_page() ) { ?>
            <h1 class="descr">
                <?php bloginfo( 'description' ); ?>
            </h1>
        <?php } else { ?>
```

PHPのテンプレート言語としての仕様を、そのまま使っています。

MSのASPやJSPの熟練者であれば違和感がないのかもしれませんが、ネスト等が複雑になってくると、私程度の脳ミソでは処理が追いつかず、段々と目眩いがするようになってきます。

PHP4でフレームワークもテンプレートエンジンも知らなかった頃から、この記法をほとんどした事がない[^4]のですが、スラスラと読める人はすごいなぁと思います。

[^4]: 代わりにヒアドキュメントを多用してましたので、それはそれでどうなの？という話です。

WordPressには任意のテンプレートエンジンを組み込む事も可能なのですが、そういう事をやっている人は今でもあまり多くないような気がします。デザイナーさんも大変なんじゃないでしょうか。(他人事)

ただ、2017年にもなって未だにテンプレートエンジンの必要性を理解できていない職業プログラマのPHPerは、PHPer失格と断言しちゃって良い気がします。

--------------------------------------------------------------------------------

### WordPressその3

ほぼWordPressのカスタマイズだけでご飯を食べているような会社も、まだまだ結構あるような気がします。元紙媒体系のデザイン会社に多いのではないでしょうか。

本屋に行くと、プログラマよりもデザイナーさん向けのWordPressの本もよく見ます。

確かにWordPressを使えば、低予算・短期間でコーポレートサイト等を作れますが、そういう会社の将来性ってどうなのかなぁ…とちょっと疑問に思ったりもします。余計なお世話ですね。スミマセン。

ただ、WordPressしか触らない人(ほとんどコードを書かない人)は、プログラマでもなければPHPerでもありませんので、そのあたりは混同したらダメかなと思います。

--------------------------------------------------------------------------------

### コピペ文化

PHPとJavaScriptでは特に言われている事だと思います。

特に情報の古いページにはとんでもないコードもたくさん転がっていて、それをコピペで使った人がまたブログ等にそのコードを書いて…という負の連鎖も、散々言われている事ですしよく分かります。

[PHP使いはもう正規表現をblogに書くな](https://www.google.co.jp/search?q=PHP%E4%BD%BF%E3%81%84%E3%81%AF%E3%82%82%E3%81%86%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%92blog%E3%81%AB%E6%9B%B8%E3%81%8F%E3%81%AA&ie=utf-8&oe=utf-8)。はい。仰る通りです。ゴメンナサイ。許してください。

思考を放棄してコピペだけでその場凌ぎをするプログラマは、論外ですしディスられて当然です。ただ、プログラミングが「選ばれし者だけが使える手段」にはなって欲しくないんですよね…。

プログラマとしてご飯を食べていく気が全くない人であっても、「いかに楽をして・ミスなく・速やかに結果を出すか」といった合理的な考え方を鍛える手段として、プログラミングに触れてみるというのは、とても良い事だと考えています。

そういう意味であれば、コピペだけでも使えるPHPのようなスクリプト言語の良さを、もう少し温かい目で見守っても良いのではないでしょうか。

--------------------------------------------------------------------------------

### Zend Frameworkの規約と閉じタグ`?>`

出力の必要がないPHPファイルの閉じタグ`?>`の省略については、ググってみると今では常識みたいに書かれていて、その点はホッとしました。

ただ、ZFのコーディング規約にはかなり昔から書かれていた気がするので、2015年2016年2017年にもなって言うような事ではないような…。ZFは流石というか、コードも規約も綺麗ですし、何となくでも良いのでそういうものには目を通した方が良いと思います。

WordPressの影響もあるのか、「`<?`で開いたものを閉じるな？意味が分からん気持ち悪い」という人がいるのも事実なので、もういっその事どこかのタイミングで、古いバージョンを切り捨てる意味も込めて、閉じる必要のない開始タグは…

```
PHP:-)
:-PHP
❨╯°□°❩╯︵PHP
```

…とかにしちゃえば良いのではないでしょうか。
<sup>怒られると嫌だから注釈を振っておきます…</sup>[^5][^6][^7]

[^5]: `:-)` 英語圏で「嬉しい」という意味で使われる顔文字。
[^6]: `:-P` 英語圏で「舌を出してあっかんべー」という意味で使われる顔文字。
[^7]: `❨╯°□°❩╯︵┻━┻` Sidekiqのアレ。

--------------------------------------------------------------------------------

### 間違いは間違いであると見抜ける人でないと正しく書くのは難しい

便利な標準関数やライブラリがたくさん揃っていて、プログラミング初学者でも気楽に始められ、手間をかけずに気軽に楽しくWebアプリを作れます…といった感じでPHPが紹介される事はよくありますし、それは別に間違ってはいません。PHPが世界中で使われ続けている大きな理由の1つです。しかしながら…

- [$_GET, $_POSTなどを受け取る際の処理](https://qiita.com/mpyw/items/2f9955db1c02eeef43ea)
- [PHPでデータベースに接続するときのまとめ](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)

書籍でもここまで言及できているものはないのでは？と思う程に、素晴らしい内容だと思うのですが、GETパラメータを受け取るだけ・DB接続するだけでも、正しく書こうとすると色んな事を知っておかなくてはいけません。

Web上に転がっているPHPのコードや情報はまさにカオスで、それが正しいものかどうかを見極めるのは、特に初心者には非常に難しいと思います。

フレームワークは、会社等での「チーム開発の効率化」という側面から取り上げられがちですが、「正しく書くのは面倒だから、そこの部分は賢い人達が用意したフレームワークに任せちゃって、自分は楽をしよう」という側面からも、積極的に利用して欲しいなと思います。

--------------------------------------------------------------------------------

### サーバーを触れないPHPer

これはダメだと思います。とりあえず何となくでも良いので、サーバーは触ってみた方が良いと思います。

仮想マシンを作成する方法・VPSやクラウド上にWebサーバを構築する方法等、今では色んな方がQiita等で情報を提供してくれています。

書いてある通りに少しずつ進めていくだけで、思ったよりも簡単に結果が得られて楽しいと思います。非常に奥の深い世界ですのでこんな事を書くと怒られそうですが、とりあえず動かすだけなら、プログラミングよりも簡単かもしれません。

それに、仮想マシンなら何かよく分からないと思ったら作り直せば良いだけですし、~~VPSやクラウドでも簡単操作でOSの再インストールができて綺麗サッパリにできますし。あれ？って思ったらとりあえずApacheを再起動してみてもいいですし。~~

--------------------------------------------------------------------------------

### PHP以外の言語を触らないPHPer

これもダメだと思います。とりあえず何となくでも良いので、何かしら別の言語には触れた方が良いと思います。例えば…

- [全角スペース等対応のtrim処理](https://qiita.com/fallout/items/a13cebb07015d421fde3)

…という記事の中で…

```php
// PHPer以外の方への説明
// trim() は、言語によっては strip の意で、全角スペースには対応していない
// mb_convert_kana($str, 's') は、文字列全体の全角スペースを半角にする意
$str = trim(mb_convert_kana($str, 's'));
```

…というググると上位にヒットするコード[^8]を紹介していますが、こういう事をやるのはPHPer以外では少ない気がします。

[^8]: 「PHPの事だから`mb_trim()`なんてものが実装されたかな？」と思ってググったら見つけたコードで、Qiitaで初めて記事を書くキッカケとなりました。

このコードにはバグが潜んでいますが、それを一目見て気づく「勘」のようなものは、PHPだけしかやっていないとなかなか身につかないような…。

こういう世界にいる以上は、とりあえず触ってみる・やってみるという姿勢がとても大事だと思っています。広く浅くやってみて、楽しいと思ったところを掘り下げていけば良いのではないでしょうか。広い知識は、新しい発想にも繋がりますし。

例えば、「ディレクトリ内の不要なファイルを定期的に削除したい」と思った時、Linuxに `tmpwatch` というコマンドがある事を知っていれば、わざわざPHPでコードを書かなくても簡単に実装できますが、知らなければ時間をかけてコードを書く事になるかもしれません。

場合によってはコードを書いた方が良いケースもありますが、それは手段の1つに過ぎませんので、色んな手段を知り選択肢を増やしておいた方が、結果的に自分も周りも幸せになれる事が多いのではと思います。

--------------------------------------------------------------------------------

### 言語仕様

PHPの言語仕様については、今更ここに書くまでもなく、イケてないところもあるのは事実です。特によく言われるのは…

- 関数の「引数や返り値」の「順番や型」に一貫性がない
- 暗黙の型変換とその比較結果

…あたりで、他言語からPHPに入った人が、「気持ち悪い」と違和感を覚えるところだと思います。上記でも触れていますが、そう感じる「勘」のようなものは、PHPしか学んでいないと身に付き難いものですので、とても大事だと思います。

ただ、PHPには他言語の良いところを積極的に取り入れていくフットワークの軽さがあり、バージョンアップに伴い改善している点も少なからずあります。また、PHPのように広く使われている言語には大抵は何かしらの解決方法があり、上記2点については、IDEを適切な設定・適切な記述で使っていれば容易に解決できます。[^9]

[^9]: phpDocumentorとの親和性が高いPhpStormを愛用しています。

完璧な仕様の言語なんてないわけで、どうしても解決できない仕様が気に入らないなら使わなければ良いだけですし、特に言語オタク系の人の主張は一種の宗教みたいなものですので、相手にしちゃダメだと思います。「ぼくのかんがえたさいきょうのげんご」が欲しいなら、自分で作れば良いのではないでしょうか？もちろん私は作れません。

極論になりますが、プログラミングやサーバーといった世界とは全く無縁の方達が、何をもってエンジニアを評価するかというと、結局は実績なんですよね。

先述とはやや矛盾しますが、胸を張れる実績があれば、別にPHPだろうがなんだろうが良いわけです。例えば、大した技術がなくとも作れるアダルトサイトであっても、月に100万円単位で稼げていたのであれば、そのセンスを認めてくれる人は世の中にたくさんいます。逆に、多数の言語やデザインパターンに精通していても、実績がなければただのオタク扱いです。

実際、PHP以外はほとんどやらない人でも、誇れる実績をもっている人は堂々としています。羨ましくもあり素敵だなと思います。

--------------------------------------------------------------------------------


## 光・陽・正

### 本は何を選ぶべきか

- 初心者(入門書)：分かりません
- 中級者・上級者：分かりません

これだからPHPerは…と怒られるのを承知で書くと、自分のお金でPHP関連の本を買ったのは人生で1回だけなので、本当に分かりません。

唯一買ったその本は、PHPマニュアルをそのまま書籍化したような、いわゆるリファレンス本でした。

Webアプリを作る手段としてはPerlの後にPHPを学んだ事もあり、自分であれこれ書かなくても、何をするにしても標準関数が用意されていたPHPの世界は、本当に宝の山のように見えて、その本をトイレに置き少しずつ目を通すようにしていました。今ならスマホがありますので、それでPHPマニュアルを読めばタダで済む話ですね。

頭に1つ1つ叩き込むというよりは、「へぇ～こんな便利そうなものがあるんだなぁ…」という感じです。何かしらの処理を書く時に「たしかあんなのがあった気がする…」と思えば、詳細はその時改めて調べ直せば良いだけですし、それを繰り返していれば自然と覚えていきますので…。

PHPのように便利な標準関数がたくさん用意されている言語では、「あんなのがあった気がする」と気付ける事が大事なのではないかと思っています。

ある程度自力でそれっぽいものが作れるようになってきた頃に、色々と本は立ち読みしましたが、当時はロジックとデザインの分離すらできていないコードを平気で載せているようなものも多く、とても2,000円3,000円を出して買う気にはなれませんでした。

自分語りで終始してしまい、申し訳ありません。

--------------------------------------------------------------------------------

### 初学者はフレームワークから学ぶべきか

- PHP4で手続き型 ⇒ PHP5でOOP ⇒ テンプレートエンジンを使ってみた ⇒ フレームワークを使ってみた

…と、オレオレフレームワークを作るといった黒歴史も経て、今のフレームワークの必要性やその良さが理解できるのは、そこまでの試行錯誤があったからこそだとは思っているのですが、その歩みが最適解か？と問われると…う～ん…という感じです。

フレームワークの利点をキチンと理解していて、言語の基礎(曖昧な表現ですが)がある程度できているのであれば、フレームワークから入る方が近道な気がします。ただ…

```php
if ($_GET['id'] == 'qiita') { }
```

…の何がどうダメなのかを1つ1つ理解していくような過程も、それはそれで楽しかったので、フレームワークに頼らずとりあえず1つぐらいはWebアプリを作ってみるというのも、良い経験になるのではないかなと思います。

--------------------------------------------------------------------------------

### フレームワークは何を選ぶべきなのか

とても賢そうな人達が口を揃えてLaravelが良いと言ってるので、Laravelで良いのではないでしょうか。(適当)

真面目な話、PHPer復帰にあたりLaravelのコードは眺めてみたのですが(読んではいません)、PHPもここまで進化したんだなぁ…というのが率直な感想です。他の言語をそれなりに習熟された方が見ても、十分見応えのある内容だと思います。

ただ、もしPHPが初めて学ぶプログラミング言語だった場合、かなりセンスのある方でないと、Laravelを理解するのは大変な気がします。(自分だったら挫折しそう)

残念ながら今回の業務ではLaravelは扱いませんでしたが、是非使いこなせるようになりたいなと考えています。

--------------------------------------------------------------------------------

### プログラミング初学者にPHPはオススメできるか

Webアプリを作る選択肢のメインがPerlだった大昔に、Webアプリを作る事が目的であればオススメできたと思うのですが、今はどうなのでしょうか。

先でも少し触れていますが、PHPは適当に書いてすぐに結果を出すのは楽な反面、「正しく」書くのは難しい[^10]言語というのが私の感覚です。

[^10]: 同じことは他の言語でもいえますが、PHPは手軽なイメージが強い分そのギャップが大きい気がします。

その「難しい」部分を埋めるのがフレームワークの役割ですが、PHP以外の言語にも優れたフレームワークはありますので、やはりPHPの優位性というのは徐々に薄れてきているのかなぁ…と思います。

初学者なら今はPythonなのかな…と思うのですが、日本は業務で使用する言語の移行が非常に遅い国ですので、Webアプリを作るのが好きで、それを就職にも活かしたいと考えているのであれば、PHPもまだまだ選択肢の内の1つだと思います。

PHPは手段の1つに過ぎませんし、人によって合う合わないもありますので、とりあえず少しずつやってみて、一番自分に合いそうなものを選ぶというのもアリかなと思います。

--------------------------------------------------------------------------------


## おまけ：スクリプト言語をパンツに例えると…

かなり前にアメリカとかで流行ったアレです。着るものに例えてた人は居なかった筈。

- `PHP` トランクス
- `Ruby` ボクサーパンツ
- `Python` ブリーフ
- `Perl` ふんどし
- `JavaScript` フル~~チ...以下自粛~~

私はトランクス派なので、PHPが一番自分に合っているような気がしてます。

「ちょっと何言ってるか分からない」と思った人は申し訳ありません。