Mais conteúdo relacionado
Semelhante a PHPコードではなく PHPコードの「書き方」を知る (20)
Mais de Masashi Shinbara (10)
PHPコードではなく PHPコードの「書き方」を知る
- 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
- 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
- 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
自動テストで検証
• 目で行うチェックは間違う
• プログラムでプログラムをチェック
• 正確無比(残酷なまでに)
• 何度でも実行できる
- 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 か?
- 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';!
}!
}!
出力をテスト
- 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
クラスは
別ファイルに
- 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;!
}!
}!
- 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;!
}!
}!
処理を分離
- 56. (c) 2014 Masashi Shinbara @shin1x1
まとめ
• 問題を分割して、小さく実装
• 関数やクラスでグループ化
• 自動テストは強い味方