Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHPコードではなく PHPコードの「書き方」を知る

27,664 views

Published on

PHPカンファレンス関西2014 B4

Published in: Technology
  • No.9 の $ php -r 'echo "Hello\n";’ は $ php -r "echo 'Hello\n';" かと
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

PHPコードではなく PHPコードの「書き方」を知る

  1. 1. 2014/06/28 shin1x1 PHPカンファレンス関西2014 PHPコードではなく PHPコードの「書き方」を知る
  2. 2. 魚を与えれば、 その日をしのぐことはできる。 ! 魚の釣り方を教えれば、 一生食べていくことができる。
  3. 3. PHPコードを知れば、 その場をしのぐことはできる。 ! PHPコードの書き方を知れば、 一生食べていくことができる。
  4. 4. PHPコードを知れば、 その場をしのぐことはできる。 ! PHPコードの書き方を知れば、 5年?食べていくことができる。
  5. 5. PHPコードの書き方を知ろう
  6. 6. PHPコードの書き方を知ろう その前に!
  7. 7. $ php -v!
  8. 8. • 黒い画面で使うPHP • PHP コマンド打つだけ( php ) で動く • 余計なものが無いので、PHP言語を学ぶには良い • 今後、検証にも使うので、実行できる環境を用意 (c) 2014 Masashi Shinbara @shin1x1 コマンドライン版PHP
  9. 9. (c) 2014 Masashi Shinbara @shin1x1 コマンドライン版PHP ! $ php file.php! • PHPファイル実行 ! $ php -r 'echo "Hellon";'! • PHPスクリプト実行
  10. 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. 11. • windows.php.net からダウンロード • Zip ファイルを展開する • コマンドプロンプトで実行 (c) 2014 Masashi Shinbara @shin1x1 Windows
  12. 12. (c) 2014 Masashi Shinbara @shin1x1 今日のコード http://bit.ly/phpkansai2014_B4
  13. 13. Are you readey?
  14. 14. FizzBuzzに見る PHPコードの書き方 (c) 2014 Masashi Shinbara @shin1x1
  15. 15. FizzBuzz とは 1から20までの整数を出力します。! ! ただし、3で割り切れる場合は「Fizz」、5で割り切 れる場合は「Buzz」、3でも5でも割り切れる場合は 「FizzBuzz」を出力します。! ! 各項目を出力する際は改行コードを入れて下さい。
  16. 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. 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. 18. (c) 2014 Masashi Shinbara @shin1x1 問題を分解してみる 1から20
  19. 19. (c) 2014 Masashi Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理
  20. 20. (c) 2014 Masashi Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理 1 2 Fizz …
  21. 21. (c) 2014 Masashi Shinbara @shin1x1 問題を分解してみる 1から20 FizzBuzz 処理 1 2 Fizz … 入力 出力処理
  22. 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. 23. (c) 2014 Masashi Shinbara @shin1x1 関数にする • 処理 = evaluate()
 FizzBuzz を返す • 出力 = render()
 改行付きで出力
  24. 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. 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. 26. (c) 2014 Masashi Shinbara @shin1x1 自動テストで検証 • 目で行うチェックは間違う • プログラムでプログラムをチェック • 正確無比(残酷なまでに) • 何度でも実行できる
  27. 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. 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. 29. (c) 2014 Masashi Shinbara @shin1x1 PHPUnit
  30. 30. (c) 2014 Masashi Shinbara @shin1x1 PHPUnit • PHPコードでテストを書ける • デファクトスタンダード • Composer でインストール
  31. 31. (c) 2014 Masashi Shinbara @shin1x1 PHPUnit http://phpunit.de/manual/current/ja/installation.html
  32. 32. <?php! class SampleTest extends PHPUnit_Framework_TestCase! {! /**! * @test! */! public function render()! {! $this->assertEquals('1', something());! }! }! テストコード something()の 戻り値が 1 か?
  33. 33. $ phpunit test/! ! ! ! ! ! ! ! OK の時は、緑
  34. 34. $ phpunit test/! ! ! ! ! ! ! ! ! ! ! ! ! ! NG の時は、赤
  35. 35. (c) 2014 Masashi Shinbara @shin1x1 FizzBuzzのテストを書く • test/FizzBuzzTest.php •fizzbuzz.php の出力をテスト • expectedOutput()
  36. 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. 37. $ phpunit test/! ! ! ! ! ! ! !
  38. 38. (c) 2014 Masashi Shinbara @shin1x1 クラスにする • FizzBuzz クラス • 関数をFizzBuzzクラスへ • クラスファイルは別ファイルにする
  39. 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. 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. 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. 42. $ phpunit test/! ! ! ! ! ! ! !
  43. 43. (c) 2014 Masashi Shinbara @shin1x1 さらにクラスにまとめる • publish() = FizzBuzz を出力 • 入力値をコンストラクタで渡す
  44. 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. 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. 46. <?php! require_once __DIR__ . '/class/FizzBuzz.php';! ! $obj = new FizzBuzz(1, 20);! $obj->publish();! シンプルなコードに
  47. 47. $ phpunit test/! ! ! ! ! ! ! !
  48. 48. おさらい (c) 2014 Masashi Shinbara @shin1x1
  49. 49. FizzBuzz とは 1から20までの整数を出力します。! ! ただし、3で割り切れる場合は「Fizz」、5で割り切 れる場合は「Buzz」、3でも5でも割り切れる場合は 「FizzBuzz」を出力します。! ! 各項目を出力する際は改行コードを入れて下さい。
  50. 50. (c) 2014 Masashi Shinbara @shin1x1 問題を分解 1から20 FizzBuzz 処理 1 2 Fizz … 入力 出力処理
  51. 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. 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. 53. <?php! require_once __DIR__ . '/class/FizzBuzz.php';! ! $obj = new FizzBuzz(1, 20);! $obj->publish();! 1から20のFizzBuzzを出力
  54. 54. $ phpunit test/! ! ! ! ! ! ! !
  55. 55. まとめ (c) 2014 Masashi Shinbara @shin1x1
  56. 56. (c) 2014 Masashi Shinbara @shin1x1 まとめ • 問題を分割して、小さく実装 • 関数やクラスでグループ化 • 自動テストは強い味方
  57. 57. (c) 2014 Masashi Shinbara @shin1x1 分割は容量と用法を守って
  58. 58. @shin1x1 (c) 2014 Masashi Shinbara @shin1x1

×