【PHP入門】開発効率向上のためのナレッジ紹介
2018/07/25
株式会社 Rosso
茂木 伸幸
1
自己紹介
• 株式会社 Rosso 技術推進室 TechLead
• 主な業務
• Webアプリケーション開発・保守
• 言語
• PHP、Ruby
• フレームワーク
• Laravel、ZendFramework、Rails
茂木 伸幸
も ぎ の ぶ ゆ き
Qiita(n_mogi)
2
本日のアジェンダ
• PHPの概要
• 静的コード解析ツールの説明
• PHPUnitの説明
• 「Laravel」の便利機能の紹介
3
今回の説明で得られる知識
• PHPの開発PJにて、整ったコードを書くためのツールの使い方
• PHPUnitの使い方
• Laravelの基礎知識
4
PHPの概要
5
PHPとは?
• Webアプリ開発の世界で広く使用されているスクリプト言語。
• HTMLの親和性が高い。
• すぐに画面を表示させることが可能で学習コストも比較的低い。
• LaravelやCakePHPなど、web開発を円滑に進めるためのFWも
多く存在する。
6
静的コード解析ツールの説明
7
静的コード解析ツールとは?
• PHPのソースコードのチェックをしてくれるツール。
• コーディング規約違反、冗長なコードを見つけてくれるなど、
複数のものが存在する。
• メリット
• 人が手動でチェック・修正するよりもツールに任せた方が効率がかな
り高くなる。
8
今回紹介するツール
• PHPCS
• PHPMD
⇒ コーディング規約違反をチェック
⇒ 冗長なコードをチェック
9
ツールその① 〜PHPCS〜
• 「PHP_CodeSniffer」の略称。
• PHPパッケージ管理ツール「composer」でインストールでき
る。
• 機能
• コードがコーディング規約に合っているかをチェックしてくれる。
10
PSR-2
• 今回採用するコーディング規約名は「PSR-2」。
• そもそもPSRとは?
• PHP-FIGが策定しているコーディング規約で、世界で知られている。
• PSR-0、PSR-1というような連番になっている。
• PSR-2とは?
• 多くのPJや一部のFW(Laravel)でも採用されているコーディング規約。
11
PHPCSの実行
• 実行方法
• AtomなどのエディタにPHPCSのプラグインを入れる。
• コマンドで実行する。
⇒ 今回はコマンドで実行します!
12
PHPCSの実行
• コマンド説明
• 例
$ phpcs --standard=規約名 ファイルパス
$ phpcs --standard=PSR2 ./
PSR2を指定
13
チェックするコード
IFの後は半角スペースが必要
引数のカンマの後は
半角スペースが必要
14
PHPCSの実行結果
FILE: /var/www/php/src/Phpcs/PhpcsSample.php
----------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 2 LINES
----------------------------------------------------------------------------
9 | ERROR | [x] Expected 1 space(s) after IF keyword; 0 found
14 | ERROR | [x] Expected 1 space between comma and argument "$b"; 0 found
----------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
----------------------------------------------------------------------------
行数と警告メッセージ
ファイルパス
[x]となっているものは、
PHPCSと同時にインストールされるPHPCBFで自動修正可能
⇒ PHPCBFはこの後説明します!
15
PHPCBFについて
• 機能
• 規約違反のコードを自動修正してくれる。
• PHPCSと同じようなコマンドで実行できる。
• コマンド説明
• 例
$ phpcbf --standard=規約名 ファイルパス
$ phpcbf --standard=PSR2 ./
同様にPSR2を指定
16
PHPCBFの実行結果
PHPCBF RESULT SUMMARY
------------------------------------------------------------------------------------------
------------------------
FILE FIXED REMAINING
------------------------------------------------------------------------------------------
------------------------
/var/www/php/src/Phpcs/PhpcsSample.php 2 0
------------------------------------------------------------------------------------------
------------------------
A TOTAL OF 2 ERRORS WERE FIXED IN 1 FILE
------------------------------------------------------------------------------------------
------------------------
Time: 872ms; Memory: 4Mb
修正済の数
修正できていない数
修正したファイル
⇒ 修正方法が複数パターンあるものについては
修正できないこともある
17
ツールその② 〜PHPMD〜
• 冗長なPHPのコードをチェックして警告してくれる。
• PHPパッケージ管理ツール「composer」でインストールでき
る。
• 主なチェック内容
• 短すぎるor長すぎるプロパティ名、変数名などのチェック。
• 複雑すぎる表現、例えばif文の多用などをチェック。
• 未使用の引数、メソッド、プロパティをチェック。
18
PHPMDで使用するルール
ルール名 説明
Clean Code Rules 綺麗なコードを保つためのルール。
Code Size Rules コードのサイズに関連するルール。
Controversial Rules PJのコーディングルールによっては採用しても良いルール。
チェック対象からは外しても問題ないことが多い。
Design Rules コード設計の問題を無くすためのルール。
危険なPHPの関数を使用していないかなどをチェックする。
Naming Rules 命名に関するルール。
プロパティ名や変数名が長すぎないかなど。
Unused Code Rules 未使用の定義に関するルール。
未使用のプロパティや変数がないかをチェックする。
19
PHPMDの実行
• 実行方法
• AtomなどのエディタにPHPMDのプラグインを入れる。
• コマンドで実行する。
⇒ PHPCSと同じくコマンドで実行します!
20
PHPMDの実行
• コマンド説明
• 例
$ phpmd ファイルパス 出力形式 ルール1,ルール2,・・・
$ phpmd ./ text cleancode,codesize,controversial,design,naming,unusedcode
21
チェックするコード
【違反しているルール】
Naming Rules
【内容】
プロパティ名が短すぎる
22
PHPMDの実行結果
/path/to/PhpmdSample.php:7 Avoid variables with short names like $a.
Configured minimum length is 3.
違反内容
対象ファイル:行数
⇒ PHPMDは自動修正の機能が無いため手動での修正が必要
23
PHPUnitの説明
24
PHPUnitとは?
• ユニットテストを自動化するためのツール。
• テストコードを書くための機能が様々存在する。
• PHPパッケージ管理ツール「composer」でインストールでき
る。
25
テストコードのメリット
• 人が手で画面のテストをするよりもテストコードを書いて自動
実行させた方が正確で速い。
• 修正作業の際に、予想外のところでバグが新たに生まれた時に
気がつくことができる。
• テストコードを書くことで、対象のメソッドがどういう振る舞
いをするのが正解なのかが実装者以外にも分かる。
⇒ PHPUnitの基本的な書き方を見ていきます
26
テスト対象のコード
第1引数と第2引数の計算
結果を返すメソッド
27
テストコード
TestCaseクラスを継承してそ
のクラスのメソッドを使う
@testは、テストコードのメ
ソッドという扱いになる
第1引数:期待値(予測値)
第2引数:メソッドの結果
28
PHPUnitの実行
• コマンド説明
• 例
$ phpunit ファイルパス(ディレクトリ or ファイル名)
$ phpunit ./tests/
29
PHPUnitの実行結果
bash-4.2# phpunit ./tests/
PHPUnit 7.2.7 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 419 ms, Memory: 4.00MB
OK (1 test, 1 assertion)
テストが通った数と割合
実行に要した時間とメモリ
テストメソッドの数と
アサーションメソッドの数
30
基本的な書き方を紹介した上で…
• データプロバイダの使い方
• モックの使い方
⇒ 他に便利なPHPUnitの機能を紹介します!
31
データプロバイダ
• 1つのテストに対して複数パターンのデータでテストしたい場
合に有効
• データを配列形式で定義したメソッドを用意する。
32
データプロバイダのコード
データプロバイダー
それぞれの配列の値がsum()の
引数に渡される。
@dataProviderでデータプロバ
イダ名(メソッド名)指定。
テストメソッドの引数を定義
できる。
データプロバイダから引数が
渡される。
33
モックの使い方
• そもそもモックとは?
• あるクラスのメソッドの戻り値をダミー値にすることができる。
• そうすることでメソッドの振る舞い(処理内容)を意識しなくて済む。
• モックが使用される場面
• メソッドの中で他のクラスのメソッドを呼んでいる場合
• 他のクラスのメソッド振る舞いを意識せずに自分のメソッドの処理だ
けに集中してテストをしたい場合
⇒ モック使用対象となるコードをまずは見ていきます
34
モック化のイメージ
⇒ 実際のコードを見ていきます
【Class A】
とあるメソッド
【Class B】
Aから呼び出されているメソッド
テスト対象のメソッド
モック化対象
35
ソースコード 〜モック化対象〜
うるう年かどうかを
boolean型で返すメソッド
36
ソースコード 〜テスト対象〜
LeapYearクラスのメソッドを
呼んでいる。
前スライドのLeapYearクラスを
コンストラクタに渡して
プロパティにオブジェクトを入れている
37
テストコード 〜モック〜
指定したクラスをモック化
モック化したクラスのメ
ソッドの振る舞いを指定
38
Laravelの便利機能の説明
39
Laravelとは?
• PHPのフレームワークで最近人気が出てきた。
• 基本はMVCモデルが採用されているフレームワーク。
• 公式ドキュメントが分かりやすく、翻訳も比較的早い。
• artisanコマンドで様々な機能が提供されていて場合によっては
開発工数を大きく削減できる。
40
紹介するLaravelの機能
• マイグレーション
• 認証機能の自動生成
• ルーティング
• ミドルウェア
⇒ webアプリケーション開発で良く使いそうな機能
41
マイグレーション
• 役割
• データベーステーブルのバージョンコントロール。
• テーブル定義が記載されているマイグレーションファイルを利用して
テーブルを作成する。
• Artisanコマンドで実行可能
• php artisan migrate(テーブル作成)
• php artisan migrate:rollback(マイグレーションの巻き戻し)
42
マイグレーションファイルの中身
• ソースコード(一部抜粋)
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
});
}
テーブル名
increments:主キー
string:VARCHARカラム
43
認証機能の自動生成
• Artisanコマンド
• php artisan make:auth
• 自動生成されるもの
• ユーザ情報テーブルのマイグレーションファイル
• 認証関連の画面(ログイン、ユーザ登録等)
• パスワード暗号化
⇒ まともに自作しようとすると数日かかりそうな認証機能を
一瞬で作成してくれる
44
ルーティング
• そもそもルーティングとは?
• ここではURLのパスを定義しているもの。
• 特定のコントローラの特定のメソッドがどのURLパスに該当するか。
• 特徴
• 単純な記述でルーティングを定義することが可能。
• Laravelの定義は自由度が高く、好きなURLパス名に簡単に出来る。
• 他のフレームワークでは、コントローラ名やメソッド名にURLパス名
が依存することが多い。
45
ルーティングの書き方
Route::get(‘path1/', ’HogeController@index');
Route::get(‘path2/', ’HugaController@create');
URLパス
好きなパスを設定でき
る
メソッド名
コントローラ名
46
ミドルウェア
• 役割
• URLにアクセスした際、画面を表示させる前にフィルターをかける。
• 例)標準で用意されている認証のミドルウェア(auth)
• ⇒未ログイン状態では見れない画面を定義できる。
• ルーティング定義の部分に適用させたいミドルウェア名を記載するこ
とで特定のURLのみに適用させることが出来る。
47
ミドルウェア使用例
Route::middleware('auth')->group(function () {
Route::get(‘path1/', ’HogeController@index');
Route::get(‘path2/', ’HugaController@create');
});
⇒ この単純な記述で未ログインでのアクセスを拒否できます
ミドルウェア名
ミドルウェアを
適用させたいURLパス
48
まとめ
• 静的コード解析ツール
• 整ったコードの作成を補助してくれるので効率良く実装を進められる。
• PHPUnit
• テストコードツールを使用することで品質を担保することができる。
• Laravel
• 自動生成機能などを駆使することで開発工数の削減につながる。
49
参考・引用リンク
• PHPCS
• https://github.com/squizlabs/PHP_CodeSniffer
• PHPMD
• https://phpmd.org/
• PHPUnit
• http://phpunit.readthedocs.io/ja/latest/
• Laravel
• https://laravel.com/docs/
50
ご清聴ありがとうございました!
51

Php development efficiency improvement

Editor's Notes

  • #2 初心者向けであることを説明する。 ツールの実例を口頭で説明する。(ジョブ組んでるのかとか)
  • #3 社内勉強会を開始してみたレポート
  • #18 ここまで13-14分
  • #24 ここまで20分
  • #25 ここまで
  • #34 ここまで30分
  • #39 ここまで40分くらい