Soumettre la recherche
Mettre en ligne
PHPコードではなく PHPコードの「書き方」を知る
•
59 j'aime
•
29,360 vues
Masashi Shinbara
Suivre
PHPカンファレンス関西2014 B4
Lire moins
Lire la suite
Technologie
Signaler
Partager
Signaler
Partager
1 sur 58
Recommandé
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーション
Masashi Shinbara
わかってるフレームワーク Laravel
わかってるフレームワーク Laravel
Masashi Shinbara
Laravel ユーザなら知っておくべきAuthオートログイン
Laravel ユーザなら知っておくべきAuthオートログイン
Masashi Shinbara
Heroku で作る スケーラブルな PHP アプリケーション
Heroku で作る スケーラブルな PHP アプリケーション
Masashi Shinbara
開発現場で活用するVagrant
開発現場で活用するVagrant
Masashi Shinbara
Vagrant体験入門
Vagrant体験入門
Masashi Shinbara
いまどきのPHP
いまどきのPHP
Masashi Shinbara
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
Recommandé
Azure Websites で作るスケーラブルな PHP アプリケーション
Azure Websites で作るスケーラブルな PHP アプリケーション
Masashi Shinbara
わかってるフレームワーク Laravel
わかってるフレームワーク Laravel
Masashi Shinbara
Laravel ユーザなら知っておくべきAuthオートログイン
Laravel ユーザなら知っておくべきAuthオートログイン
Masashi Shinbara
Heroku で作る スケーラブルな PHP アプリケーション
Heroku で作る スケーラブルな PHP アプリケーション
Masashi Shinbara
開発現場で活用するVagrant
開発現場で活用するVagrant
Masashi Shinbara
Vagrant体験入門
Vagrant体験入門
Masashi Shinbara
いまどきのPHP
いまどきのPHP
Masashi Shinbara
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Masashi Shinbara
Scala on Hadoop
Scala on Hadoop
Shinji Tanaka
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
Sugawara Genki
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
Sugawara Genki
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
Kohei Hoshi
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Python
masahitojp
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
Taro Hirose
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
nabe-abk
Yesod勉強会
Yesod勉強会
Hideyuki Tanaka
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
Ansible入門
Ansible入門
Daiki Hayakawa
AngularFireで楽々バックエンド
AngularFireで楽々バックエンド
Yosuke Onoue
How Smalltalker Works
How Smalltalker Works
Sho Yoshida
javascript を Xcode でテスト
javascript を Xcode でテスト
Yoichiro Sakurai
Java EE勉強会 開発合宿 成果発表
Java EE勉強会 開発合宿 成果発表
Akihiro Harai
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
Sugawara Genki
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
Masashi Shinbara
VagrantユーザのためのDocker入門
VagrantユーザのためのDocker入門
Masashi Shinbara
Contenu connexe
Tendances
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Masashi Shinbara
Scala on Hadoop
Scala on Hadoop
Shinji Tanaka
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
Sugawara Genki
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
Sugawara Genki
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
Kohei Hoshi
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Tomohiro Kumagai
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Python
masahitojp
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
Taro Hirose
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
nabe-abk
Yesod勉強会
Yesod勉強会
Hideyuki Tanaka
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
Ansible入門
Ansible入門
Daiki Hayakawa
AngularFireで楽々バックエンド
AngularFireで楽々バックエンド
Yosuke Onoue
How Smalltalker Works
How Smalltalker Works
Sho Yoshida
javascript を Xcode でテスト
javascript を Xcode でテスト
Yoichiro Sakurai
Java EE勉強会 開発合宿 成果発表
Java EE勉強会 開発合宿 成果発表
Akihiro Harai
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
TanUkkii
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Naoya Ito
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
Sugawara Genki
Tendances
(20)
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Scala on Hadoop
Scala on Hadoop
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
Elixir Meetup #1 Loggerの構造と拡張
Elixir Meetup #1 Loggerの構造と拡張
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
serverless framework + AWS Lambda with Python
serverless framework + AWS Lambda with Python
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
Yesod勉強会
Yesod勉強会
Cinnamon - simple deploy tool
Cinnamon - simple deploy tool
Ansible入門
Ansible入門
AngularFireで楽々バックエンド
AngularFireで楽々バックエンド
How Smalltalker Works
How Smalltalker Works
javascript を Xcode でテスト
javascript を Xcode でテスト
Java EE勉強会 開発合宿 成果発表
Java EE勉強会 開発合宿 成果発表
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
これからのJavaScriptー関数型プログラミングとECMAScript6
これからのJavaScriptー関数型プログラミングとECMAScript6
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
En vedette
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
Masashi Shinbara
VagrantユーザのためのDocker入門
VagrantユーザのためのDocker入門
Masashi Shinbara
ビルドサーバで使うDocker
ビルドサーバで使うDocker
Masashi Shinbara
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
Masashi Shinbara
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
Masashi Shinbara
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
Masashi Shinbara
Docker introduction
Docker introduction
dotCloud
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
Masashi Shinbara
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Masashi Shinbara
先取り!PHP 7 と WordPress
先取り!PHP 7 と WordPress
Masashi Shinbara
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
キャラ立ちしたエンジニアになる!
キャラ立ちしたエンジニアになる!
Masashi Shinbara
Composer 再入門
Composer 再入門
Masashi Shinbara
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
Masanori Satoh
全自動Zabbix2.2&2.4
全自動Zabbix2.2&2.4
真乙 九龍
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室
Yusuke Ando
超高速WordPress ~ PHP7 vs HHVM vs PHP5.6
超高速WordPress ~ PHP7 vs HHVM vs PHP5.6
Kengyu Nakamura
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]
Masashi Shinbara
PHPによるユニットテスト入門
PHPによるユニットテスト入門
Hiromu Shioya
AWS初心者向けWebinar AWSクラウドでのWindowsの実行
AWS初心者向けWebinar AWSクラウドでのWindowsの実行
Amazon Web Services Japan
En vedette
(20)
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
VagrantユーザのためのDocker入門
VagrantユーザのためのDocker入門
ビルドサーバで使うDocker
ビルドサーバで使うDocker
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
Docker introduction
Docker introduction
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携
先取り!PHP 7 と WordPress
先取り!PHP 7 と WordPress
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
キャラ立ちしたエンジニアになる!
キャラ立ちしたエンジニアになる!
Composer 再入門
Composer 再入門
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
レガシーコードを改善した先にあるもの、それは継続的インテグレーション
全自動Zabbix2.2&2.4
全自動Zabbix2.2&2.4
8時間耐久PHPUnitの教室
8時間耐久PHPUnitの教室
超高速WordPress ~ PHP7 vs HHVM vs PHP5.6
超高速WordPress ~ PHP7 vs HHVM vs PHP5.6
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]
PHPによるユニットテスト入門
PHPによるユニットテスト入門
AWS初心者向けWebinar AWSクラウドでのWindowsの実行
AWS初心者向けWebinar AWSクラウドでのWindowsの実行
Similaire à PHPコードではなく PHPコードの「書き方」を知る
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
Moriyoshi Koizumi
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Arata Fujimura
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
leverages_event
Local php-100828 2
Local php-100828 2
Akio Ishida
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
sters
php.js
php.js
Kenta USAMI
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
最近の PHP の話
最近の PHP の話
y-uti
Symfony2 How to create your Bundle
Symfony2 How to create your Bundle
chobi e
PHP7を魔改造した話
PHP7を魔改造した話
Moriyoshi Koizumi
プログラマ進化論
プログラマ進化論
Sotaro Omura
Cakephp api
Cakephp api
Eiji Yokota
Perl 非同期プログラミング
Perl 非同期プログラミング
lestrrat
WCO2012「PHP教室」
WCO2012「PHP教室」
Takuma Morikawa
Okinawapm #1
Okinawapm #1
Kei Kamikawa
Hack/HHVM 入門
Hack/HHVM 入門
y-uti
Silex入門
Silex入門
Takuya Sato
WPerのWPerによるWPerのためのPHP入門
WPerのWPerによるWPerのためのPHP入門
Muyuu Fujita
Similaire à PHPコードではなく PHPコードの「書き方」を知る
(20)
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
よいことも悪いこともぜんぶPHPが教えてくれた
よいことも悪いこともぜんぶPHPが教えてくれた
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
Local php-100828 2
Local php-100828 2
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
PHPBLT#6 PHPの未来に入るかもしれない機能の紹介
php.js
php.js
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
最近の PHP の話
最近の PHP の話
Symfony2 How to create your Bundle
Symfony2 How to create your Bundle
PHP7を魔改造した話
PHP7を魔改造した話
プログラマ進化論
プログラマ進化論
Cakephp api
Cakephp api
Perl 非同期プログラミング
Perl 非同期プログラミング
WCO2012「PHP教室」
WCO2012「PHP教室」
Okinawapm #1
Okinawapm #1
Hack/HHVM 入門
Hack/HHVM 入門
Silex入門
Silex入門
WPerのWPerによるWPerのためのPHP入門
WPerのWPerによるWPerのためのPHP入門
Plus de Masashi Shinbara
日本語消えたスライド
日本語消えたスライド
Masashi Shinbara
Twilio入門 -Web アプリ編-
Twilio入門 -Web アプリ編-
Masashi Shinbara
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
Masashi Shinbara
How to learn Laravel5 application from Authentication
How to learn Laravel5 application from Authentication
Masashi Shinbara
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオン
Masashi Shinbara
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Masashi Shinbara
PHP 5.5 Zend OPcache
PHP 5.5 Zend OPcache
Masashi Shinbara
サーバの防災訓練
サーバの防災訓練
Masashi Shinbara
Kansai PHP Users Group 2012年活動報告
Kansai PHP Users Group 2012年活動報告
Masashi Shinbara
10分で分かる最近のCakePHP
10分で分かる最近のCakePHP
Masashi Shinbara
Plus de Masashi Shinbara
(10)
日本語消えたスライド
日本語消えたスライド
Twilio入門 -Web アプリ編-
Twilio入門 -Web アプリ編-
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
How to learn Laravel5 application from Authentication
How to learn Laravel5 application from Authentication
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
PHP 5.5 Zend OPcache
PHP 5.5 Zend OPcache
サーバの防災訓練
サーバの防災訓練
Kansai PHP Users Group 2012年活動報告
Kansai PHP Users Group 2012年活動報告
10分で分かる最近のCakePHP
10分で分かる最近のCakePHP
PHPコードではなく PHPコードの「書き方」を知る
1.
2014/06/28 shin1x1 PHPカンファレンス関西2014 PHPコードではなく PHPコードの「書き方」を知る
2.
魚を与えれば、 その日をしのぐことはできる。 ! 魚の釣り方を教えれば、 一生食べていくことができる。
3.
PHPコードを知れば、 その場をしのぐことはできる。 ! PHPコードの書き方を知れば、 一生食べていくことができる。
4.
PHPコードを知れば、 その場をしのぐことはできる。 ! PHPコードの書き方を知れば、 5年?食べていくことができる。
5.
PHPコードの書き方を知ろう
6.
PHPコードの書き方を知ろう その前に!
7.
$ php -v!
8.
• 黒い画面で使うPHP • PHP
コマンド打つだけ( php ) で動く • 余計なものが無いので、PHP言語を学ぶには良い • 今後、検証にも使うので、実行できる環境を用意 (c) 2014 Masashi Shinbara @shin1x1 コマンドライン版PHP
9.
(c) 2014 Masashi
Shinbara @shin1x1 コマンドライン版PHP ! $ php file.php! • PHPファイル実行 ! $ php -r 'echo "Hellon";'! • PHPスクリプト実行
10.
• 最近の OSX
には、PHP が標準添付 • OSX 10.9 = PHP 5.4.24 • ターミナルから実行 (c) 2014 Masashi Shinbara @shin1x1 Mac ! $ /usr/bin/php -v ! PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
11.
• windows.php.net からダウンロード •
Zip ファイルを展開する • コマンドプロンプトで実行 (c) 2014 Masashi Shinbara @shin1x1 Windows
12.
(c) 2014 Masashi
Shinbara @shin1x1 今日のコード http://bit.ly/phpkansai2014_B4
13.
Are you readey?
14.
FizzBuzzに見る PHPコードの書き方 (c) 2014 Masashi
Shinbara @shin1x1
15.
FizzBuzz とは 1から20までの整数を出力します。! ! ただし、3で割り切れる場合は「Fizz」、5で割り切 れる場合は「Buzz」、3でも5でも割り切れる場合は 「FizzBuzz」を出力します。! ! 各項目を出力する際は改行コードを入れて下さい。
16.
<?php! for ($i =
1; $i <= 20; $i++) {! if ($i % 3 === 0 && $i % 5 === 0) {! echo 'FizzBuzz' . PHP_EOL;! } else if ($i % 3 === 0) {! echo 'Fizz' . PHP_EOL;! } else if ($i % 5 === 0) {! echo 'Buzz' . PHP_EOL;! } else {! echo $i . PHP_EOL;! }! } Sample1
17.
$ php fizzbuzz.php! 1! 2! Fizz! 4! Buzz! Fizz! 7! 8! Fizz! Buzz! 11! Fizz! 13! 14! FizzBuzz! 16! 17! Fizz! 19! Buzz!
18.
(c) 2014 Masashi
Shinbara @shin1x1 問題を分解してみる 1から20
19.
(c) 2014 Masashi
Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理
20.
(c) 2014 Masashi
Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理 1 2 Fizz …
21.
(c) 2014 Masashi
Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理 1 2 Fizz … 入力 出力処理
22.
(c) 2014 Masashi
Shinbara @shin1x1 入力・処理・出力が混在 <?php! for ($i = 1; $i <= 20; $i++) {! if ($i % 3 === 0 && $i % 5 === 0) {! echo 'FizzBuzz' . PHP_EOL;! } else if ($i % 3 === 0) {! echo 'Fizz' . PHP_EOL;! } else if ($i % 5 === 0) {! echo 'Buzz' . PHP_EOL;! } else {! echo $i . PHP_EOL;! }! }
23.
(c) 2014 Masashi
Shinbara @shin1x1 関数にする • 処理 = evaluate() FizzBuzz を返す • 出力 = render() 改行付きで出力
24.
<?php! function evaluate($i) {! if
($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! function render($output) {! echo $output . PHP_EOL;! }! ! for ($i = 1; $i <= 20; $i++) {! $fizzbuzz = evaluate($i);! render($fizzbuzz);! }! Sample2
25.
<?php! function evaluate($i) {! if
($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! function render($output) {! echo $output . PHP_EOL;! }! ! for ($i = 1; $i <= 20; $i++) {! $fizzbuzz = evaluate($i);! render($fizzbuzz);! }!
26.
(c) 2014 Masashi
Shinbara @shin1x1 自動テストで検証 • 目で行うチェックは間違う • プログラムでプログラムをチェック • 正確無比(残酷なまでに) • 何度でも実行できる
27.
$ php fizzbuzz.php! 1! 2! Fizz! 4! Buzz! Fizz! 7! 8! Fizz! Buzz! 11! Fizz! 13! 14! Fizz! 16! 17! Fizz! 19! Buzz!
28.
$ php fizzbuzz.php! 1! 2! Fizz! 4! Buzz! Fizz! 7! 8! Fizz! Buzz! 11! Fizz! 13! 14! Fizz! 16! 17! Fizz! 19! Buzz! 15
= FizzBuzz
29.
(c) 2014 Masashi
Shinbara @shin1x1 PHPUnit
30.
(c) 2014 Masashi
Shinbara @shin1x1 PHPUnit • PHPコードでテストを書ける • デファクトスタンダード • Composer でインストール
31.
(c) 2014 Masashi
Shinbara @shin1x1 PHPUnit http://phpunit.de/manual/current/ja/installation.html
32.
<?php! class SampleTest extends
PHPUnit_Framework_TestCase! {! /**! * @test! */! public function render()! {! $this->assertEquals('1', something());! }! }! テストコード something()の 戻り値が 1 か?
33.
$ phpunit test/! ! ! ! ! ! ! ! OK
の時は、緑
34.
$ phpunit test/! ! ! ! ! ! ! ! ! ! ! ! ! ! NG
の時は、赤
35.
(c) 2014 Masashi
Shinbara @shin1x1 FizzBuzzのテストを書く • test/FizzBuzzTest.php •fizzbuzz.php の出力をテスト • expectedOutput()
36.
<?php! class FizzBuzzTest extends
PHPUnit_Framework_TestCase! {! /**! * @test! */! public function render()! {! $expected = <<<EOT! 1! 2! Fizz! …! Buzz! ! EOT;! ! $this->expectOutputString($expected);! include __DIR__ . '/../fizzbuzz.php';! }! }! 出力をテスト
37.
$ phpunit test/! ! ! ! ! ! ! !
38.
(c) 2014 Masashi
Shinbara @shin1x1 クラスにする • FizzBuzz クラス • 関数をFizzBuzzクラスへ • クラスファイルは別ファイルにする
39.
<?php! class FizzBuzz! {! public function
evaluate($i)! {! if ($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! public function render($outout)! {! echo $outout . PHP_EOL;! }! }!
40.
<?php! class FizzBuzz! {! public function
evaluate($i)! {! if ($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! public function render($outout)! {! echo $outout . PHP_EOL;! }! }!
41.
<?php! require_once __DIR__ .
'/class/FizzBuzz.php';! ! $obj = new FizzBuzz();! ! for ($i = 1; $i <= 20; $i++) {! $fizzbuzz = $obj->evaluate($i);! $obj->render($fizzbuzz);! } FizzBuzz クラスは 別ファイルに
42.
$ phpunit test/! ! ! ! ! ! ! !
43.
(c) 2014 Masashi
Shinbara @shin1x1 さらにクラスにまとめる • publish() = FizzBuzz を出力 • 入力値をコンストラクタで渡す
44.
<?php! class FizzBuzz! {! protected $start;! protected
$end;! ! public function __construct($start, $end)! {! $this->start = $start;! $this->end = $end;! }! ! public function publish() {! for ($i = $this->start ; $i <= $this->end ; $i++) {! $fizzbuzz = $this->evaluate($i);! $this->render($fizzbuzz);! }! } Sample3
45.
<?php! class FizzBuzz! {! protected $start;! protected
$end;! ! public function __construct($start, $end)! {! $this->start = $start;! $this->end = $end;! }! ! public function publish() {! for ($i = $this->start ; $i <= $this->end ; $i++) {! $fizzbuzz = $this->evaluate($i);! $this->render($fizzbuzz);! }! }! ! protected function evaluate($i)! {! if ($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! protected function render($outout)! {! echo $outout . PHP_EOL;! }! }!
46.
<?php! require_once __DIR__ .
'/class/FizzBuzz.php';! ! $obj = new FizzBuzz(1, 20);! $obj->publish();! シンプルなコードに
47.
$ phpunit test/! ! ! ! ! ! ! !
48.
おさらい (c) 2014 Masashi
Shinbara @shin1x1
49.
FizzBuzz とは 1から20までの整数を出力します。! ! ただし、3で割り切れる場合は「Fizz」、5で割り切 れる場合は「Buzz」、3でも5でも割り切れる場合は 「FizzBuzz」を出力します。! ! 各項目を出力する際は改行コードを入れて下さい。
50.
(c) 2014 Masashi
Shinbara @shin1x1 問題を分解 1から20 FizzBuzz 処理 1 2 Fizz … 入力 出力処理
51.
<?php! for ($i =
1; $i <= 20; $i++) {! if ($i % 3 === 0 && $i % 5 === 0) {! echo 'FizzBuzz' . PHP_EOL;! } else if ($i % 3 === 0) {! echo 'Fizz' . PHP_EOL;! } else if ($i % 5 === 0) {! echo 'Buzz' . PHP_EOL;! } else {! echo $i . PHP_EOL;! }! } 混然一体となったコード
52.
<?php! class FizzBuzz! {! protected $start;! protected
$end;! ! public function __construct($start, $end)! {! $this->start = $start;! $this->end = $end;! }! ! public function execute() {! for ($i = $this->start ; $i <= $this->end ; $i++) {! $fizzbuzz = $this->evaluate($i);! $this->render($fizzbuzz);! }! }! ! protected function evaluate($i)! {! if ($i % 3 === 0 && $i % 5 === 0) {! return 'FizzBuzz';! } else if ($i % 3 === 0) {! return 'Fizz';! } else if ($i % 5 === 0) {! return 'Buzz';! } else {! return $i;! }! }! ! protected function render($outout)! {! echo $outout . PHP_EOL;! }! }! 処理を分離
53.
<?php! require_once __DIR__ .
'/class/FizzBuzz.php';! ! $obj = new FizzBuzz(1, 20);! $obj->publish();! 1から20のFizzBuzzを出力
54.
$ phpunit test/! ! ! ! ! ! ! !
55.
まとめ (c) 2014 Masashi
Shinbara @shin1x1
56.
(c) 2014 Masashi
Shinbara @shin1x1 まとめ • 問題を分割して、小さく実装 • 関数やクラスでグループ化 • 自動テストは強い味方
57.
(c) 2014 Masashi
Shinbara @shin1x1 分割は容量と用法を守って
58.
@shin1x1 (c) 2014 Masashi
Shinbara @shin1x1