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.

40分濃縮 PHP classの教室

37,926 views

Published on

PHPカンファレンス関西2012で使用したスライドです。完全な内容は下北沢で開催した際のスライドと動画を御覧ください。

Published in: Technology
  • 東京で開催した際の動画はこちら。
    http://www.ustream.tv/recorded/21256905
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

40分濃縮 PHP classの教室

  1. 1. 40分間濃縮PHP classの教室 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  2. 2. PHPカンファレンス北海道2012 / Yusuke Ando (@yando)
  3. 3. 本日の対象者 PHPを使っている 関数はなんとなくわかる classを理解したい 完全版はWebで40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  4. 4. 本日のメニュー 関数を使ったPHP オブジェクト指向の基礎 コードの拡張性を上げる40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  5. 5. by jepoirrier 関数を使ったPHP40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  6. 6. 関数とは 処理に名前を付ける引数(ひきすう)を受け取る 好きな処理をする 返り値(かえりち)を返す40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  7. 7. function<?phpfunction hoge() { return date( Y-m-d );}function fuga($w = null) { if (is_null($w)) { $w = date( w ); } $list = array( 日 , 月 , 火 , 水 , 木 , 金 , 土 ); return $list[$w];}echo hoge(); // 2012-03-21 などと表示echo fuga(3); // 水 と表示 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  8. 8. functionの細かいとこ 名前の大文字小文字 スコープ 引数の順番 2重定義40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  9. 9. 名前の大文字小文字<?phpfunction hoge() { return date(Y-m-d);}echo hoge(); // 2012-03-21 などと表示echo Hoge();echo HOGE();echo hogE();$a = hoge;echo $a(); 全部同じ結果 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  10. 10. スコープ<?php$out = 1000;function hoge() { $in = ABCD; echo $out; hoge()内で有効なのは echo $etc;} $inのみfunction fuga() { $etc = XYZ;}hoge();hoge(); $inが有効なのはecho $in; hoge()内のみ 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  11. 11. 引数の順番<?phpfunction hoge($a) {}function fuga($a, $b =0){}function moge($a=null,$b=null,$c) {}hoge(1); //OKfuga(1); //OKmoge(1,2,3); //OKhoge();fuga(); 必須の引数が指定されてmoge(1,2); いないとエラー 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  12. 12. 二重定義<?phpfunction hoge() {}function hoge() {} FATALエラー 真っ白になります 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  13. 13. 練習1 関数を作ってください 引数: 名前、性別 結果: 男なら○○くん 女なら○○ちゃん40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  14. 14. 作例1<?phpfunction getLabel($name, $sex) { if ($sex == 1) { $suffix = くん; } else { $suffix = ちゃん; } return $name . $suffix;}echo getLabel(つとむ, 1); //つとむくんecho getLabel(やよい, 2); //やよいちゃん 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  15. 15. 練習2 練習1の機能は維持して 年齢も引数で受け取り 12歳以上なら ○○君/○○さん40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  16. 16. 作例2<?phpfunction getLabel($name, $sex, $age=0) { if ($sex == 1) { $suffix = くん; if ( $age >= 12) { $suffix = 君; } } else { $suffix = ちゃん; if ( $age >= 12) { $suffix = さん; } } return $name . $suffix . "n";}echo getLabel(つとむ, 1,10); //つとむくんecho getLabel(やよい, 2,20); //やよいさん 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  17. 17. 練習3練習1,2の機能は維持して 男の子なら青 女の子ならピンクになるようにタグで囲む。(タグなしの機能も残す)40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  18. 18. <?php 作例3function getLabel($name, $sex, $age=0, $coloring=false) { echo getLabel(つとむ, 1); //つとむくん if ($sex == 1) { echo getLabel(やよい, 2); //やよいちゃん $suffix = くん; echo getLabel(つとむ, 1,10); //つとむくん $color = blue; echo getLabel(やよい, 2,8); //やよいちゃん if ( $age >= 12) { echo getLabel(つとむ, 1,12); //つとむ君 $suffix = 君; echo getLabel(やよい, 2,20); //やよいさん } echo getLabel(つとむ, 1,0,true); } else { //<span style=color:blue>つとむくん</span> $suffix = ちゃん; echo getLabel(やよい, 2,0,true); $color = pink; //<span style=color:pink>やよいちゃん</span> if ( $age >= 12) { $suffix = さん; } } $str = "<span style=color:$color>". $name . $suffix ."</span>n"; if (!$coloring) { $str = $name . $suffix . "n"; } return $str;} 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  19. 19. 練習4練習1,2,3の機能は維持して学校種別を名前の後に表示 することもできるように 例: つとむくん(小)40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  20. 20. <?php 作例4 } else if ( $age >= 18 && $age <= 21 ) {function getLabel($name, $sex, $age=0, $coloring=false, $suffix .= "(大)";$school=false ) { } if ($sex == 1) { $str = "<span style=color:$color>". $suffix = くん; $name . $suffix . "</span>n"; $color = blue; if (!$coloring) { if ( $age >= 12) { $str = $name . $suffix . "n"; $suffix = 君; } } return $str; } else { } $suffix = ちゃん; $color = pink; echo getLabel(つとむ, 1); //つとむくん if ( $age >= 12) { echo getLabel(やよい, 2); //やよいちゃん $suffix = さん; echo getLabel(つとむ, 1,10); //つとむくん } echo getLabel(やよい, 2,8); //やよいちゃん } echo getLabel(つとむ, 1,12); //つとむ君 if ( $age >= 6 && $age <= 11 ) { echo getLabel(やよい, 2,20); //やよいさん $suffix .= "(小)"; echo getLabel(つとむ, 1,10,false,true); //つとむくん } else if ( $age >= 12 && $age <= 14 ) { echo getLabel(やよい, 2,8,false,true); //やよいちゃん $suffix .= "(中)"; echo getLabel(つとむ, 1,12,false,true); //つとむ君 } else if ( $age >= 15 && $age <= 17 ) { echo getLabel(やよい, 2,20,false,true); //やよいさん $suffix .= "(高)"; 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  21. 21. なんかヤバイ40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  22. 22. 長さがヤバイ エディタに収まらなく なりつつある40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  23. 23. マジックナンバー この数字や文字を後で変 更する時にミスりそう40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  24. 24. 多すぎる引数 呪文と化した引数40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  25. 25. 複数の関数に分割? 共通部分が多く 引数も多い 簡単には分割できない40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  26. 26. 分割するにも 扱っている変数が多い40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  27. 27. 関数の弱点 引数と返り値は複雑なデータを扱うには貧弱 (データが単純ならOK)40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  28. 28. ダークサイドの誘惑40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  29. 29. 一見綺麗だが… このあたりの変数名が 衝突した瞬間にアウト40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  30. 30. 再利用性に乏しい データをセットしなおさ す必要がある40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  31. 31. つまりあのプラグインを入れた ら真っ白に… ここでは動いているけ ど、あっちではダメ似たような関数がたくさ んコピペされている 手出しできない密林が コードにある 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  32. 32. by wocrigオブジェクト指向の基礎40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  33. 33. 最初に覚える事•クラス •プロパティ •定数 •メソッド•インスタンス40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  34. 34. クラス<?phpclass MyClass { const HOGE =100; public $some_string = こんにちは ; public $num; public function sayHello() { echo Hello ; }} classでクラスを宣言 プロパティ、定数、メソッド をクラス内に宣言できる 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  35. 35. インスタンス化<?php$obj = new MyClass();$obj->sayHello();$obj->some_string = AAAA ; クラスとして宣言した処理を 利用する為のオブジェクトを作成アロー演算子(->)でメソッド等を指定 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  36. 36. $this<?phpclass MyClass { const HOGE =100; public $some_string = こんにちは ; public function sayHello() { echo $this->some_string; }} 自分自身を指すオブジェクト メソッド内で使える 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  37. 37. const<?phpclass MyClass { const HOGE =100; public function sayHello() { echo self::HOGE; // MyClass::HOGE でもOK }} オブジェクトに属する定数を設定 self:: か クラス名:: で参照できる 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  38. 38. $this<?phpclass MyClass { public $some_string = こんにちは ; public function sayHello() { echo $this->some_string; } public function change() { $this->some_string = こんばんわ ; }} プロパティはメソッドを跨って 参照や更新ができる 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  39. 39. オブジェクトには 関数には出来なかった 引数・返り値以外のデータを扱う方法がある!40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  40. 40. これを整理してみる40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  41. 41. 練習5クラスを作ってくださいプロパティ: 名前、性別 メソッド:下記を返す 男なら○○くん 女なら○○ちゃん40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  42. 42. 作例5.140分濃縮PHP classのクラス / Yusuke Ando (@yando)
  43. 43. 初期化をどうするか名前と性別の初期化が必要 引数 直接セット 初期化用メソッド40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  44. 44. 引数 破滅の予感40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  45. 45. 直接セット 面倒くさい40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  46. 46. 初期化用メソッド 忘れそう40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  47. 47. コンストラクタ<?phpclass MyClass { public $name; public __construct($name) { $this->name = $name; }}__construct というメソッドを作成クラスをnewしてインスタンス化時に 必ず実行される! 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  48. 48. 作例5.240分濃縮PHP classのクラス / Yusuke Ando (@yando)
  49. 49. 練習6 コンストラクタで年齢も受け取りプロパティへ 12歳以上なら ○○君/○○さん40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  50. 50. 作例640分濃縮PHP classのクラス / Yusuke Ando (@yando)
  51. 51. その他の機能•アクセス修飾子•オートロード•namespace•static40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  52. 52. アクセス修飾子<?phpclass MyClass { const HOGE =100; private $some_string = こんにちは ; public function sayHello() { echo Hello ; }}メソッドやプロパティへのクラス外から のアクセスを制限できる public / private / protected 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  53. 53. アクセス修飾子 外部アクセスが不要な プロパティ メソッドをprivateにする事が多い40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  54. 54. オートロード<?phpfunction __autoload($class_name) {    include $class_name . .php;}$obj  = new MyClass1();$obj2 = new MyClass2();クラス名とファイル名を整理しておくと クラスを自動的に読み込める (クラス定義のみ別ファイルが理想) 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  55. 55. namespace<?phpnamespace myname;class MyClass {}function myfunction() {}const MYCONST = 1;$c = new mynameMyClass;さらには namespace という文法を使っ てフォルダ階層とクラスを対応させる 方法がPHP5.3以降で使えるように 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  56. 56. static<?phpclass MyClass { const HOGE =100; private $some_string = こんにちは ; public static function sayHello() { echo Hello ; }}echo MyClass::sayHello(); staticが指定されたメソッドは インスタンスを作らずに実行できる 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  57. 57. staticの落とし穴<?phpclass MyClass { const HOGE =100; private $some_string = こんにちは ; public static function sayHello() { echo $this->some_string; }}echo MyClass::sayHello(); staticが指定されたメソッドは $thisを使えない! 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  58. 58. staticはステートレスstaticはインスタンス毎のデータが扱え ず、実質グローバル関数と同じ補助的な処理などに利用されるが、多用 するとグローバル関数と 同じ問題を引き起こします 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  59. 59. by MarkyBonコードの拡張性を上げる40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  60. 60. クラスを拡張する機能•継承•抽象クラス•インターフェース•トレイト•マジックメソッド40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  61. 61. 継承<?phpclass MyClass { public function hoge() { echo a ; }}class MySubClass extends MyClass {}$obj = new MySubClass();$obj->hoge(); 既存のクラスを再利用して クラスを作る 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  62. 62. parent::<?phpclass MyClass { public function hoge() { echo a ; }}class MySubClass extends MyClass { public function Hello() { parent::hoge(); }}メソッドを再利用して新しい処理を作成 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  63. 63. 継承 元のクラスは親クラス、 スーパークラスと呼ぶ parent:: で参照できる既存のメソッドを上書きも可 privateは触れない40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  64. 64. 練習7 クラスを作ってください Kidを継承したHtmlKid 出力時に 男子は青、女子はピンク40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  65. 65. 練習7Kid.php - 先程のコードHtmlKid.php - 新規test.phpから実行 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  66. 66. 作例740分濃縮PHP classのクラス / Yusuke Ando (@yando)
  67. 67. 抽象クラス<?phpabstract class BaseClass { abstract protected function fuga(); public function hoge() { echo a ; } 親クラスになる為だけのクラス 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  68. 68. インターフェース<?phpinterface iihito { public function sayHello();}class Person implements iihito { public function sayHello(){ }} 特定のメソッドの保持を強制する 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  69. 69. トレイト<?phptrait iihito { public function sayHello() { }}class Person{ use iihito;}特定のメソッドをクラスに注入する 40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  70. 70. 最初に思う疑問 継承 抽象クラス インターフェース トレイト なぜ似たような機能が?40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  71. 71. 継承は1つのみ インタフェース トレイトは柔軟40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  72. 72. マジックメソッドクラスに作ると特定のタイミングで自動的に実行され るすごいメソッド40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  73. 73. マジックメソッド40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  74. 74. まとめ40分濃縮PHP classのクラス / Yusuke Ando (@yando)
  75. 75. classは•複雑なコードを整理•コードの拡張性を確保•コードをメンテナンスするクラス=難しい ではなく難しい問題 を解決する為の機能です40分濃縮PHP classのクラス / Yusuke Ando (@yando)

×