~短期集中講座~ 土日でわかる PHPプログラミング教室　環境づくりからWebアプリが動くまでの2日間コース

## 「~短期集中講座~ 土日でわかる PHPプログラミング教室　環境づくりからWebアプリが動くまでの2日間コース」について

### 構成
3部構成になっています。
金曜(2時間)は環境構築
土曜(6時間)はPHPの入門
日曜(8時間)はフレームワークを用いて実際にアプリを作る
となっています。

### 対象者
プログラミング未経験者です。未経験者対象の本だと、ちょこっとかじるには良くても、開発の現場では役に立たない、という場合が多いです。しかしこの本は、開発環境はvagrantだったり、FuelPHPフレームワークを使ったり、と、Webアプリ開発の現場との乖離は少ないと思われます。この本で学んだから即戦力になれるわけではありません。しかし、vagrantやフレームワークに最初から触れておくと、現場に出たときに戸惑いがすくないだろう、と思います。

### FuelPHP採用
この本は、FuelPHPフレームワークを利用する、という特徴があります。素のPHPよりも、フレームワークを使うほうが楽なケースは多いです。また実際の開発現場でフレームワークを使うケースも多いでしょうから、この方針は良いと思います。

### この本を読むと、作れるようになるアプリ
この本では、社内の連絡アプリ「総務へおねがい」というアプリを作ります。社員がおねがいを書きこみ、総務の人が確認、対応後は削除する、というものです。アプリとしてはかなりシンプルですが、初めて作るアプリとしては十分だと思われます。

## 全体としては良い

一通り読んで、一部のサンプルコードを実際に動かしてみました。初学者にとってはかなり有用な本だと思われます。なお、私が普段使っている環境で行ったので、環境構築(金曜部分)は未調査です。

### 簡単ではあるが、実際に動くアプリを作る

本書は「座学ではなく体験」といったコンセプトで書かれています。用語などの詳細な説明よりも、実際に手を動かしてみる、ということが重視されています。FuelPHPのscaffold(雛形を作る機能)の助けを借りてではありますが、実際に動くアプリを自分で作れるようになっています。自分で書き換えていく場所も、書籍の中で分かりやすく書いてあるので、初学者でも躓きにくいと思います。やや難しい箇所はStep Upとして記載されています。最初はStep Upを飛ばして進む、最後まで読んでからStep Upを読む、といった読み方ができます。

### FuelPHP採用

この本では、フレームワークFuelPHPを採用しています。書籍の55ページでは、
1. PHP5.3で書かれている
2. (他のフレームワークに比べて)シンプルで軽量である
3. MVCフレームワークである
といった特徴がある、と紹介されています。
「PHP5.3で書かれている」は、これだけだと分かりにくいですね。PHP5.3では、名前空間など様々な機能追加が行われました。FuelPHPは開発当初からPHP5.3を前提としているため、PHP5.3で導入された新機能を採用しています。また古いバージョンのPHPの後方互換性を考慮しなくて良いため、綺麗に記述されています。

FuelPHPであれば、実際に案件で採用している会社も結構あります。弊社もその一つです。またFuelPHPベースのCMSもあります。FuelPHPを学んでおくと、実際の開発現場で役立つことも多いと思われます。仮にFuelPHP採用でない場合も、MVCフレームワークであれば、大まかな動作を把握していると、別のフレームワークでも入っていきやすいと思われます。

### クロスサイトスクリプティング(XSS)、SQLインジェクション

ウェブアプリケーションの脆弱性としてよく取り上げられるものに、クロスサイトスクリプティング(XSS)、SQLインジェクションがあります。これらはFuelPHPを使うことで、アプリケーションを作るときに特別気を使わなくても、「かなり」安全に作成できます。XSSは、ビューでのエスケープ漏れで発生しやすいです。FuelPHPでは、ビューへデータを渡すときにデフォルトでエスケープします。このため、「不注意によるエスケープ漏れ」=「XSS」の可能性を減らすことができます。ちなみに弊社で使うフレームワークの選定時には、FuelPHPの「デフォルトでエスケープする」という点を評価して選定しました。またデータベースとのやりとりも、SQLを書くのではなく、FuelPHPが用意しているORMを使うことで、SQLインジェクションが起きないようになっています。
「かなり」と書いたのは、FuelPHP自体のバグの可能性があるからです。しかしプログラミング入門としては、フレームワーク自体のバグは考慮しなくても良いのではないかと思います。


## とはいえ問題点も

PHPの説明やセキュリティに関しては、手ばなしで賞賛するわけにはいきません。少なくとも、以下の3つは改善してもらいたいと考えています。
※追記※出版元の正誤表で修正されていますので、そちらも参考にしてください。

### 問題点1 クラスメソッドの呼び出し
128ページでは、
`クラス名::メソッド名(引数1、引数2);`
という記述がなされています。FuelPHPでは、静的メソッドが多用されているので、この記法でよいケースは多々あります。しかし書籍では、ここの前のコードでは
`function space_cell($count){
    ...
}`
とメソッド定義していますから、静的メソッドではありません。静的メソッドでないものを静的メソッドと同様に呼び出ししようとした場合、PHP5だとE_STRICT警告ですが、PHP7だとE_DEPRECATED警告になります。将来のどこかの時点で廃止されるでしょう。
「FuelPHPを使えるようになればよい」と割り切るとしても、FuelPHPのメソッドで静的でないものもあるので、この説明だと困るケースも出てきます。

### 問題点2 文字列処理
#### substrでの文字列切り取り
この本では、タイトルが長すぎる場合に、substrで文字列切り取りをしています。substrは、文字列を指定の長さだけ切り出す関数です。substrの実際の処理は、文字の長さではなくてバイト数です。アルファベットであれば、1文字＝1バイトなので、問題ありません。しかし、マルチバイト文字列の場合は、文字の長さとバイト数は一致しません。この本では、日本語で12文字を切り取るために、次のような処理を行っています。
`substr($item->body,0,36);`
この方式だと、$item->bodyが全部日本語なら良いですが、アルファベットや半角数字が入っていた場合、きちんと切り取ることができません。また、「M&Aとは、...」のように、文字の中に&や<などがあった場合も困ります。

#### FuelPHPの機能を使うのが好ましい
FuelPHPでは、文字列の処理をしたい場合に役立つStrクラスが用意されています。Strクラスには、文字列を指定した長さで切り取る[truncateメソッド](http://fuelphp.jp/docs/1.8/classes/str.html#/method_truncate)が用意されています。
`Str::truncate($item->body, 12);`
とすれば、$item->bodyの先頭の12文字を切り出すことができます。

Str::truncateは、HTMLタグを考慮した切り取りにも対応しています。
`Str::truncate($item->body, 12, '...', true);`
といった形で記述すればOKです。引数は順に、切り取り対象の文字列、切り取る長さ、切り取った後の文字列の末尾に付与する文字列、HTMLタグを破壊しないで切り取るかどうかのフラグ、です。
FuelPHPフレームワークを採用しているのですから、サンプルコードでもFuelPHPの機能を活用したほうが良かったように思います。

### 問題点3 クロスサイトリクエストフォージェリ(CSRF)
#### scaffold で作られるコードは未対策

FuelPHPのscaffold機能は便利です。しかし、scaffold機能で生成したコードは、CSRF対策が施されていません。個人的にはscaffold機能で生成するコードがデフォルトでCSRF対策されると良い、と考えています。そのほうが脆弱性が減らせると思います。ちなみにWordPressでは管理画面を作成するときに自動的にCSRF対策が入ります。

初学者向けとはいえ、管理画面を作るのですから、CSRF対策については何がしかの説明があったほうが良かったですね。

## 読むことをお勧めできる人
「ウェブデザイナーやマークアップエンジニアで、PHPについても知りたい人。」がベストマッチでしょう。この本を読めば、FuelPHPのビュー部分のコーディングを担当することができると思います。

## この先の学習について
この本はFuelPHPの機能にかなり依存しています。「FuelPHPのビュー部分のコーディング」ができればよい、という方であれば、本書だけで良いかもしれません。そうでない場合は、他の本も読む必要があります。

### プログラマを目指す場合
「はじめてのフレームワークとしてのFuelPHP 改訂版」「改訂 FuelPHP入門」が出版されています。FuelPHPプログラマを目指すのであれば、どちらも読んで損はありません。

### FuelPHP以外のプロジェクトで、ビューのコーディングに関わる場合
この本の知識だけだと困る可能性が高いです。別の本も読むなどの学習が必要でしょう。


## 最後に
業務で使うアプリを作るのであれば、土日ではなく勤務時間中に作りましょう。