社内で行った初心者向けPHP勉強会のスライドを改変したものです。

社内のiOSエンジニアを想定して資料を作成しました。

プログラム自体の初心者ではないが、PHPでのウェブサービスの作り方についてよく分からないという方向けの入門です。


この文書に記述されていること

PHPでウェブアプリを作成するための重要な知識とツールをまとめました。


この文書に記述されていないこと

文法については説明しません。 HTML,CSS,Javascriptなどのフロントエンド関連の情報もありません。


PHPのコード例

PHPのコード例です。PHPは現時点(PHP5.6)ではとても平凡な文法の言語です。 他の普通の言語(Ruby,Java,C++)を一つでも知っている人であれば文法の習得は容易です。


PHP開発ツール


PHPStorm一択で

phpstorm


PHPに関するドキュメント


PHP: The Right Way

php-the-right-way

PHPによる現時点でのベストプラクティスをまとめ上げたウェブサイト。

文法に関する説明はありません。


PHP逆引きレシピ第2版

php-recipe

PHPを使ったコードの実装方法について詳細に記述されています。 文法についても学べます。

初心者に一冊与えるとしたらこれです。


Modern PHP

modern-php

PHPを使ったウェブサービスを提供する上での基本的な知識が網羅されています。 他の言語を使える人にとってのとても良いPHP入門書ですが英語です。

PHPの文法に関する説明は一部を除いてありません。

 


PHPの動かし方

上記のソースコードはコマンドラインとしてもウェブページとしても表示させられます。


コマンドライン(php)

スクリプト言語なので普通にコマンドラインから実行できます。 $という文字はコマンドプロンプトを意味します。実際には入力しません。


ビルトインウェブサーバー(php -s)

hoge.php

5.4以降のPHPではビルトインウェブサーバを使うことができます。Apacheやnginxを使用せずともPHPの動作確認が可能です。

一度に一つのリクエストしか受け付けてくれないので本番サーバには使用できません。


Read-eval-print loop(psysh)

PHPでは標準で 対話シェル(php-a) が用意されていますがが、あまり便利ではありません。


psyshはPHPのコードを対話型に実行できる、俗に言うREPLです。 Rubyで言うところのpryです。 入力した内容が即座に反映されるので言語やライブラリの習得に便利です。


laravelでartisan tinkerを実行する時に内部で呼ばれているのもこのpsyshです。


ライブラリのインストールとバージョン固定について(Composer,Packagist)


composerについて

サードパーティのライブラリのプロジェクト単位でのインストールやバージョン固定、依存性管理を行います。 node.jsのnpm,RubyのBundler,Pythonのpipのようなものです。 2011年に開発が開始されました。


packagistについて

composer対応PHPライブラリをまとめた公式リポジトリが Packagist です。


packagist

ダウンロード数やユーザーが付けたスターの数も確認できます。


基本的な使い方

carbonというライブラリをインストールするには以下のコマンドで行います。


インストールするライブラリ名やバージョンはcomposer.jsonに記述することもできます。 依存情報をテキストに記述することでgitでの版数管理が可能になります。 コマンドでインストールしたライブラリの情報もcomposer.jsonに自動的に追記されます。


インストールしたライブラリはvendorディレクトリに配置されます。 インストールしたライブラリは以下のrequire文を追加するだけで利用できるようになります。 依存するライブラリが複数あってもこの一つのrequire文だけで使用できるようになります。


その他の使い方


global require

composerは基本的にプロジェクト単位のライブラリインストールを行うツールですが、 「npm install -g」のようにグローバルにインストールすることもできます。


global requireを実行すると、~/.composer/vendor以下にphpunitがインストールされます。

実行可能なプログラムがある場合~/.composer/vendor/bin/にインストールされます。


create-project

フレームワークの新規プロジェクトを作成するときにはcomposer create-projectが使えることがあります。上記はlaravelの例です。


PSRについて

PSRはPHP Standard Recommendationの略です。


PHPにはRoRのような極端に強いWAFが存在しないことや、 近代的な言語機能が追加される時期が遅かった(名前空間のサポートは2009年の5.3.0までありませんでした)こともあり、microなものやフルスタックなものなど非常にたくさんのWAFが乱立しています。


WAFは様々なコンポーネントから成り立っています。 かつてそれらは独自に実装されていることが多く 他のWAFのコンポーネントを相互に使うことが難しい状態でした。


2009年のphp|tekというイベントで行われたコンポーネント間相互利用に関する議論をきっかけに PHP-FIG(PHP Framework Interop Group)が発足しました。


PHP-FIGのメンバー達がコンポーネント間の相互利用を目的にコーディング規約やロガーのインターフェイスなどを整備したものがPSRです。 現在のステータスはPSR indexで見られます。


コンポーネント作成者向けですがPSR-2はコーディング規約であり普通のプログラマにも有用です。 PHPStormなどのIDEを使用していれば自然にPSR-2のスタイルに整形されます。


最近ではHTTPのメッセージングI/Fを規定するPSR-7が制定されました。 DIコンテナの規約であるPSR-11なども提案されています。


PSRとComposerの恩恵

ComposerとPSRによりフレームワーク間のコンポーネントの相互利用が容易になってきました。


Slimframework

  • ルータ、DIコンテナ、HTTPメッセージングに外部コンポーネントを利用しています。
  • DIコンテナはPSR-11を満たすどんなコンポーネントも使用できます。
  • HTTPメッセージングはPSR-7を満たすどんなコンポーネントも使用できます。

Laravel

  • Laravelは多くのSymfony2のコンポーネントを利用しています。
  • またLaravelのEloquent ORMは他のフレームワークでも利用できます。

フラットなPHPからWAFへ


フラットなPHP

フラットなPHP=1ファイルで書かれたPHP

以下はビューもロジックも混在したフラットなPHPファイルの例です。


WAFの目的

  • ビューとロジックの分離
  • ルーティング
  • HTTPのリクエストやレスポンスの処理

index.php


entry.tpl


ビューとロジックの分離

index.php

entry.tpl


ルーティング

index.php

httpのリクエストを一つのファイルが一手に引き受けてURLごとに 処理を切り分けることをルーティングと言います。


HTTPのリクエストやレスポンスの処理

HTTPのリクエストやレスポンスを簡単に扱うための仕組みです。


WAF紹介

PSRのセクションで紹介した通りPHPにはたくさんのWAFが存在します。

以下に主だったWAFの年表があります。

A History Of PHP Frameworks/Library Collections

今回はmicroなものとmacroな物をひとつづつ紹介します。


slim

slim160

PHP: The Right Way のJosh Lockhartが作成したWAFです。 Rubyで言うところのSinatraです。


laravel

laravel160

2014年にブレイクしたWAFです。 Eloquentという独自のORMを持っています。 Rubyで言うところのRailsです。


データの永続化

ウェブサイトではユーザーから受け取ったデータを保存したり取り出したりする処理が必要になることがあります。 データの保存にはデータベースが利用されます。

  • Data Access Object(PDO)
  • Active Record(Eloquent ORM)
  • Data Mapper(Doctrine2)

Data Access Object(PDO)

データベースを利用する現時点で一番原始的な方法がPDOによるものです。 テーブルとSQLを直接意識して操作する必要があります。


Active Record(Eloquent ORM)

laravelでデータを永続化するにはEloquent ORMを利用します。


Eloquent ORMはRuby on Railsで有名になったActive Recordパターンを適用した ORM(Object-relational mapping)ライブラリです。


activer(出典:PofEAA)


Active Recordパターンはわかりやすい反面ベースとなる大きいクラスを継承したクラスを利用するため後述するDataMapperパターンを適用したORMに比べてパフォーマンスが劣ります。


usersというテーブルが既にあれば、Eloquentを継承したクラスを作るだけでデータベースを直感的に操作できます。


Data Mapper(Doctrine2)

Doctrine2はData MapperパターンをベースとしたORMです。

SymphonyフレームワークにはDoctrine2というORMコンポーネントが含まれています。


2015年9月にlaravelとdoctrine2を統合するLaravel Doctrine の1.0がリリースされました。


datamapper(出典:PofEAA)


モデルを表現するクラス(上記例ではScientistやTheory)には複雑なロジックを入れず、 データベース操作部分はエンティティマネージャーに、複雑なビジネルロジック部分は リポジトリマネージャーに分離することができます。


自動テスト

  • unit testing
  • mock

phpunit

phpunitはunit testingを行うためのフレームワークです。 assertメソッドを用いてコードが期待する動作をすることをテストします。


mockery

クラスBに依存するクラスAのユニットテストを行いたい時、 クラスBのテストをしたいのではないのでクラスBをクラスBのふりをする別のものに置き換えて テストを行います。 このようなクラスBのふりをするオブジェクトをモックと呼びます。


phpunitにもmock作成ツールはありますが使いやすいmockeryが広く使われています。 laravelのコンポーネントもmockeryによりテスト時の入れ替えが容易になっています。


終わりに

PHPでウェブアプリを作成するための重要な知識とツールをまとめました。

この文書がカバーするキーワードをすべて理解できるなら、 モダンなウェブアプリケーションを実装するためのスタートラインに立てたと言えます。

Follow me!