More Related Content
PDF
Azure Websites で作るスケーラブルな PHP アプリケーション PDF
PDF
Laravel ユーザなら知っておくべきAuthオートログイン PDF
Heroku で作る
スケーラブルな
PHP アプリケーション PDF
PDF
PDF
PDF
ECMAScript6による関数型プログラミング What's hot
PDF
PPT
PDF
PDF
Elixir Meetup #1 Loggerの構造と拡張 PPTX
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016 PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai PDF
serverless framework + AWS Lambda with Python PDF
PDF
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて) PPTX
PDF
Cinnamon - simple deploy tool PDF
PDF
PDF
PDF
PDF
PDF
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6 PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for... PDF
Viewers also liked
PDF
PDF
PDF
PDF
認証機能で学ぶ Laravel 5 アプリケーション PDF
レイヤードアーキテクチャを意識した PHPアプリケーションの構築 ver2 PDF
レイヤードアーキテクチャを意識したPHPアプリケーションの構築 PPTX
PDF
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境 PDF
Twilio を使えば簡単にできる アプリケーションと電話/SMS連携 PDF
PDF
PDF
PDF
PDF
レガシーコードを改善した先にあるもの、それは継続的インテグレーション PDF
PDF
PDF
超高速WordPress ~ PHP7 vs HHVM vs PHP5.6 PDF
Vagrant で作る PHP 開発環境 [実践編] PDF
PDF
AWS初心者向けWebinar AWSクラウドでのWindowsの実行 Similar to PHPコードではなく PHPコードの「書き方」を知る
PDF
GMO TECHNOLOGY BOOT CAMP2015(PHP編) PDF
PDF
PDF
PDF
KEY
EC-CUBE + PHPUnit で 実践テスト駆動開発 PDF
PDF
PDF
PHPの今とこれから2024 at PHP Conference Japan 2024 PDF
PDF
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜 PDF
PDF
PDF
Modern PHP Programming @ PFI Seminar PPTX
Php development efficiency improvement PPTX
PPTX
PHPCON_TOKYO_2022_Bigginer.pptx PDF
PDF
More from Masashi Shinbara
PDF
PDF
PDF
PDF
How to learn Laravel5 application from Authentication PDF
Vagrant で PHP 開発環境を作る ハンズオン PDF
PDF
PDF
PDF
Kansai PHP Users Group 2012年活動報告 KEY
PHPコードではなく PHPコードの「書き方」を知る
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
• 黒い画面で使うPHP
• PHPコマンド打つだけ( php ) で動く
• 余計なものが無いので、PHP言語を学ぶには良い
• 今後、検証にも使うので、実行できる環境を用意
(c) 2014 Masashi Shinbara @shin1x1
コマンドライン版PHP
- 9.
(c) 2014 MasashiShinbara @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.
- 12.
- 13.
- 14.
- 15.
- 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.
- 18.
- 19.
- 20.
- 21.
(c) 2014 MasashiShinbara @shin1x1
問題を分解してみる
1から20
FizzBuzz
処理
1
2
Fizz
…
入力 出力処理
- 22.
(c) 2014 MasashiShinbara @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 MasashiShinbara @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 MasashiShinbara @shin1x1
自動テストで検証
• 目で行うチェックは間違う
• プログラムでプログラムをチェック
• 正確無比(残酷なまでに)
• 何度でも実行できる
- 27.
- 28.
- 29.
- 30.
(c) 2014 MasashiShinbara @shin1x1
PHPUnit
• PHPコードでテストを書ける
• デファクトスタンダード
• Composer でインストール
- 31.
(c) 2014 MasashiShinbara @shin1x1
PHPUnit
http://phpunit.de/manual/current/ja/installation.html
- 32.
<?php!
class SampleTest extendsPHPUnit_Framework_TestCase!
{!
/**!
* @test!
*/!
public function render()!
{!
$this->assertEquals('1', something());!
}!
}!
テストコード
something()の
戻り値が 1 か?
- 33.
- 34.
- 35.
(c) 2014 MasashiShinbara @shin1x1
FizzBuzzのテストを書く
• test/FizzBuzzTest.php
•fizzbuzz.php の出力をテスト
• expectedOutput()
- 36.
<?php!
class FizzBuzzTest extendsPHPUnit_Framework_TestCase!
{!
/**!
* @test!
*/!
public function render()!
{!
$expected = <<<EOT!
1!
2!
Fizz!
…!
Buzz!
!
EOT;!
!
$this->expectOutputString($expected);!
include __DIR__ . '/../fizzbuzz.php';!
}!
}!
出力をテスト
- 37.
- 38.
(c) 2014 MasashiShinbara @shin1x1
クラスにする
• FizzBuzz クラス
• 関数をFizzBuzzクラスへ
• クラスファイルは別ファイルにする
- 39.
<?php!
class FizzBuzz!
{!
public functionevaluate($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 functionevaluate($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.
- 43.
(c) 2014 MasashiShinbara @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.
- 47.
- 48.
- 49.
- 50.
- 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.
- 54.
- 55.
- 56.
(c) 2014 MasashiShinbara @shin1x1
まとめ
• 問題を分割して、小さく実装
• 関数やクラスでグループ化
• 自動テストは強い味方
- 57.
- 58.