Modern PHP Programming @ PFI Seminar

15,989 views
15,799 views

Published on

Published in: Technology
4 Comments
32 Likes
Statistics
Notes
No Downloads
Views
Total views
15,989
On SlideShare
0
From Embeds
0
Number of Embeds
3,920
Actions
Shares
0
Downloads
138
Comments
4
Likes
32
Embeds 0
No embeds

No notes for slide

Modern PHP Programming @ PFI Seminar

  1. 1. Modern PHP Programming ~コピパーからの脱出~ @ PFI 社内セミナー by id:sotarok
  2. 2. PHP もっとも誤解されたプログラミング言語 最強のウェブ開発言語 簡単 速い かわいい
  3. 3. 本日のお話の構成 PHP PHPの特徴 PHPのソコソコ入門 独断と偏見によるモダンPHP入門 最近のPHPを取り巻く環境 ※本文中の記号 5.3 のみ 5.3 お得情報 TIPS
  4. 4. PHP の特徴 5 つ これだけ抑えれば PHP の8割はOK!
  5. 5. PHPの特徴 (1) ウェブ特化型プログラミング言語 HTMLの中にプログラムロジックをかける でも書かないでね (ぉ
  6. 6. PHPの特徴 (2) math JSON XML HTTP なんでも入り なんでも関数 MySQL なんでもバンドル ... ./configure –help 362 行 --enable-hoge でだいたい入る 最近のLinux パッケージだと php5 でコア, php5-mbstring で mbstring 拡張,など機能単体 でパッケージになっている
  7. 7. PHPの特徴 (3) 神がかったドキュメント 更新速すぎ 開発中機能とかもドキュメントがあったりする サンプルコードつき コメントつけられる 日本語訳速すぎ TIPS php.net/fopen fopen があればマニュアルにリダイレクト なければ検索結果
  8. 8. PHPの特徴 (4) PHPer -> 「ぺちぱー」と読む PHP -> 「ぺちぺ」と読む phpize (コマンド) -> 「ぺちぱいず」と読む
  9. 9. PHPの特徴 (5) TIPS PHP を dis るとホッテントリ入りする PHPer は必ず釣れる なぜか Perl の人も釣れる なぜかほかの言語の人が大量に釣れる ここぞ!とばかりに「これだから PHP は ...」と のたまう (←おまえPHP何もわかってないだろ
  10. 10. PHP ソコソコ入門 とりあえず使ってみる
  11. 11. PHP のインストール Linux % aptitude install php5 php5-mbstring ... % yum install php php-mbstring ... Mac OS % port install php5 +mbstring ... Windows 茨の道へようこそ でも最近MSさんがんばってるみたい! http://www.microsoft.com/japan/php ソースから (略 cf. ) http://trac.nequal.jp/browser/public/dotfiles/sotarok/misc/php53.sh
  12. 12. 動かす % echo "<?php phpinfo(); " > /path/to/www/info.php
  13. 13. とりあえず書いてみる <html> <head><title>PHP test</title></head> <body> <ul> <?php foreach (range(1, 10) as $v) { echo '<li>', $v, '</li>'; } ?> </ul> </body></html>
  14. 14. とりあえず書いてみる <html> <head><title>PHP test</title></head> <body> <ul> <?php foreach (range(1, 10) as $v) { echo '<li>', $v, '</li>'; } ?> <?php から ?>まで が PHP ブロック </ul> </body></html> プログラムとして実行. それ以外は出力される
  15. 15. 余談 思わずかつての PHP っぽさを出すために HTMLの中にPHPコードと書いちゃったけ ど本当言うとこういうのはサンプルでも 出すべきじゃないとは思うんですよね, 「そういうのがPHPなんだ」という第一印 象が根強くついてしまうからです.とい うわけで今後は全部CLIのサンプルコード がでてきます.プログラミングPHPについ ての発表ですので!ウェブアプリに関し ては興味があればまた聞いてください!
  16. 16. 変数 常にドル <?php $_hogefuga = 1; 文 セミコロンで終わる <?php $hoge = 1;
  17. 17. 変数 ちなみに 常にドル 閉じタグ ?> は省略可能 <?php というかむしろ 「PHPのみが記述されたファイル」 のみが記述されたファイル」 のみが記述されたファイル $_hogefuga = 1; では書かないことが推奨 推奨される では書かないことが推奨される (不要な改行が出力されてしまう危 不要な改行が出力されてしまう危 されてしまう 険性があるため があるため) 険性があるため) 文 セミコロンで終わる <?php $hoge = 1;
  18. 18. 自動定義変数/スーパーグローバル変数 http://jp.php.net/manual/ja/reserved.variables.php 自動的に定義される <?php var_dump($argc); あらゆるスコープからアクセス可能 ウェブサーバ経由でPHPが起動された場合 http://localhost/hoge.php?hoge=fuga <?php var_dump($_GET['hoge']); // fuga var_dump($_SERVER['REMOTE_ADDR']); //環境変数
  19. 19. PHPの型 初期化方法,変換関数などにより動的に 変わる <?php $hoge = 1; // $hoge = 1.0; // 整数 $hoge = "1"; // 浮動小数点 $hoge = null; // null 文字列 $hoge = true; // bool $hoge = array(1,2,3,); // $hoge = new DateTime(); // Object 配列
  20. 20. PHPの型 初期化方法,変換関数などにより動的に 変わる <?php $hoge = intval(1); $hoge = floatval($hoge); $hoge = strval($hoge); ...
  21. 21. 変数を見たい! var_dump 関数 オブジェクトの中身も全部見れる <?php $hoge = 1; var_dump($hoge); $hoge = "hoge"; var_dump($hoge); int(1) string(4) "hoge"
  22. 22. 演算子 (特徴的なもののみ) 比較演算子 == / != / === / !== エラー制御演算子 @ 文字列結合 . 型演算子 instanceof
  23. 23. 比較演算子 http://www.php.net/manual/ja/types.comparisons.php http://d.hatena.ne.jp/hnw/20080606 ==/!= での比較は,キャストが発生します ===/!== を使いましょう! 全部 true です <?php var_dump("1" == 1); var_dump("10匹のハエ" == 10); var_dump(null == false); var_dump(array() == false);
  24. 24. 関数 関数 <?php function add ($v1, $v2) { return $v1 + $v2; } echo add(1, 2), PHP_EOL; // 3
  25. 25. 文字列 PHP PHPは基本的になんでも文字列 ストリームも コールバックも 5.3以前は無名関数定義すらも! create_function !!!! 誰も使わねえよ <?php $html = file_get_contents( "http://www.preferred.jp/" ); $int_a = array_map('intval',array("1", "2", "3",));
  26. 26. 配列 順序付きハッシュテーブル 添え字配列/連想配列 → いっしょくた なんでも配列にする文化 <?php $array = array( 1, 2, 3, 'hoge' => 1, 4 => 4, 'array' => array(1, 2, 3, 4,), );
  27. 27. クラス 普通にクラスが定義できます <?php class Hello { public function greeting($name) { echo 'Hello ', $name, PHP_EOL; } } $h = new Hello(); $h->greeting('sotarok');
  28. 28. クラス定義についてもうちょっと <?php class Hello extends Fuga { // extends で継承 // プロパティ protected $name = "sotarok"; // コンストラクタ public __construct() { ... } // メソッド public function greeting($name) { echo 'Hello ', $name, PHP_EOL; // プロパティには $this-> でアクセス echo 'My name is', $this->name, PHP_EOL; } }
  29. 29. クラス定義についてもうちょっと2 クラス定数 const プロパティの修飾 public/private/protected static メソッドの修飾 public/private/protected static クラス abstract インターフェース interface / implements スコープ定義演算子 ::
  30. 30. クラス定義についてもうちょっと3 $this キーワード $this->prop $this->method(); クラス定数 Hoge::PIYO; メソッドのstatic呼びだし Hoge::piyo(); static 変数へのアクセス Hoge::$static_prop = 5;
  31. 31. 定義済みのなにか PHPには定義済みのなにかがいーーっぱい 拡張機能を入れると関数・クラス・定数はグロー バルに定義されるから.↓の数は環境により違う 定義済み関数: 1725 % php -r 'var_dump(count(array_shift(get_defined_functions()) ));' 定義済み定数: 1696 % php -r 'var_dump(count(get_defined_constants()));' 定義済みクラス: 145 % php -r 'var_dump(count(get_declared_classes()));'
  32. 32. 独断と偏見によるモダンPHP入門 えーまだそんな書き方してるの? 古代の人? といわれないために. HTMLとロジックの分離 主な内容: オブジェクト指向 インターフェース オーバーロード Autoload 例外・エラーハンドリング SPL SimpleXML DateTime 名前空間 フレームワーク
  33. 33. HTMLとロジックは分離 Logic.php index.php Library.php (エントリーポイント) View.html
  34. 34. ライブラリ 1 1ファイル1クラスが基本 1 require_once / autoload などで必要なファ イルを読み込んで利用 class |-- Action | |-- Info.php | `-- UnitTest.php Ethna_Action_UnitTest |-- ActionForm.php |-- Backend.php |-- CLI | `-- ActionClass.php |-- Controller.php Ethna_ActionForm |-- DB | |-- ADOdb.php
  35. 35. オブジェクト指向 メソッドチェイン アクセス修飾子 インターフェース (interface) 抽象クラス (abstract) <?php $time = new DateTime(); echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo')) ->add(DateInterval::createFromDateString('1 month')) ->format('Y-m-d H:i:s'), PHP_EOL; 2009-12-26 15:41:45
  36. 36. メソッドチェイン (をするとモダンだよ,という意味ではなく, できるよ,というだけの話) <?php class Hoge { ... function fuga() { ... return $this; } function piyo() { ... return $this; } function poyo() { return $some_value; } } $hoge = new Hoge(); $value = $hoge->fuga()->piyo()->poyo();
  37. 37. インターフェース class Members implements Iterator { private $m = array( '早乙女アルト' => array(16, '中村悠一',), 'ランカ・リー' => array(15, '中島愛',), 'シェリル・ノーム' => array(17, '遠藤綾',), ); public function key() { return key($this->m);} public function current() {return current($this->m); } public function next() { next($this->m); } public function rewind() {reset($this->m);} public function valid() {return $this->current() !== false; } } foreach (new Members as $k => $v) { echo $k, ": ", $v[0], "歳, CV:", $v[1], PHP_EOL; }
  38. 38. インターフェース class Members implements Iterator { private $m = array( '早乙女アルト' => array(16, '中村悠一',), 'ランカ・リー' => array(15, '中島愛',), 'シェリル・ノーム' => array(17, '遠藤綾',), ); 早乙女アルト: 16歳,{ CV:中村悠一 public function key() return key($this->m);} ランカ・リー: 15歳, {CV:中島愛 } public function current() {return current($this->m); } public function next() next($this->m); シェリル・ノーム: 17歳, CV:遠藤綾 public function rewind() {reset($this->m);} public function valid() {return $this->current() !== false; } } foreach (new Members as $k => $v) { echo $k, ": ", $v[0], "歳, CV:", $v[1], PHP_EOL; }
  39. 39. インターフェース いくつかの定義済みインターフェース Iterator イテレート可能になる (foreach にわたせる) ArrayAccess 配列的なアクセスが可能になる SPL インターフェース (後述)
  40. 40. オーバーロード C++とかのオーバーロードとは違います のまえに,マジックメソッドについて __ で始まるメソッド なにかの条件のときに自動的に呼ばれるメ ソッド 例: __toString() これが定義されていると,オブジェクトをstring として呼んだとき(echoしたりとか),このメ ソッドが呼ばれる
  41. 41. マジックメソッド __construct / __destruct __isset __unset __sleep / __awake __clone __invoke __get / __set / __call / __callStatic
  42. 42. __get class Hoge { 存在しないプロパティにアクセスされた public function __get($name) { echo "really want to get ", $name, " ?", ときに呼ばれる PHP_EOL; return $name; } } $h = new Hoge(); echo $h->piyo; // piyo ってプロパティは存在しない! // __get が呼ばれる → なにかしらの値が返ってくる
  43. 43. __set class Hoge { 存在しないプロパティにアクセスされた private $prop = array(); public function __set($name, $value) { ときに呼ばれる echo "set ", $name, " !", PHP_EOL; $this->prop[$name] = $value; } } $h = new Hoge(); $h->piyo = 'fuga'; // piyo ってプロパティは存在しない! // __set が呼ばれる → fugaがどこかにセットされる
  44. 44. __call class Hoge { 存在しないプロパティにアクセスされた public function __call($name, $args) { ときに呼ばれる $name, " called!", PHP_EOL; echo "method ", return call_user_func__array( array($this->some_object, $name), $args) ); } } $h = new Hoge(); $h->piyo('piyo piyo'); // piyo ってメソッドは存在しない! // __call が呼ばれる
  45. 45. __callStatic 5.3 class Hoge { 存在しないプロパティにアクセスされた public function __callStatic($name, $args) { ときに呼ばれる $name, " called!", PHP_EOL; echo "method ", return call_user_func__array( array($this->some_object, $name), $args) ); } } Hoge::piyo('piyo piyo'); // Hogeクラスのpiyoってstaticメソッドは存在しな // __callStatic が呼ばれる い!
  46. 46. オーバーロードの使いどころ とにかくライブラリ作る人向けの機能 でも使う人にも当然恩恵がある 必要なリソースの必要なときに確保する class Hoge { public function __call($name, $args) { ... $name をパースして呼びだすメソッドを動的に } 変更 }
  47. 47. __call を使ったモデルクラス(例) public function __call($method, $args) { if (preg_match("|^findBy|", $method)) { $column = strtolower(str_replace('findBy', '', $method)); $q = array_shift($args); if (!array_key_exists($column, $this->prop)) { return false; } return $this->find(D::D_FIRST, array($column => $q,)); } }
  48. 48. __call を使ったモデルクラス(例) public function __call($method, $args) { if (preg_match("|^findBy|", $method)) { $column = strtolower(str_replace('findBy', '', $method)); $q = array_shift($args); if (!array_key_exists($column, $this->prop)) { return false; } findByName() などでメソッドが呼ばれ,「name フィールドが DB に存在したら,それに一致するレ return $this->find(D::D_FIRST, array($column => $q,)); } コードを取り出す」というメソッドを呼び出す } メソッドを自分で定義する必要がなく,レコード定 義さえわかれば,あたかもメソッドとして使える
  49. 49. 例外 try { ... } catch (Exception $e) { ... } できるようになった! 例外を発生させる throw new Exception("message"); 新しいライブラリ・フレームワークでは すでに導入されている しかし ... PHP本体が例外をはいてくれないので生煮え -> ErrorException で対応
  50. 50. 例外使う <?php class MyException extends Exception {} try { if (!file_exists('./hoge')) { throw new MyException("ふぁいるないよ"); } ... 処理を続行 } catch (MyException $e) { // キャッチ // メッセージを表示して終了 echo $e->getMessage(), PHP_EOL; exit(1); }
  51. 51. PHPのエラーハンドリング エラーハンドラを自分で定義して登録 挙動を変えられる set_error_handler('関数名'); エラーが発生すると,エラーコードとともに この関数が呼ばれる フレームワークはだいたいこれでエラー制御 ログに吐いたりアラーとメール飛ばしたり おす こともできる→ ErrorException で,すべてのエラーをexceptionに投げな
  52. 52. ErrorException http://jp.php.net/manual/ja/class.errorexcepti on.php すべてのエラーを例外にする方法 <?php function exception_error_handler ($errno, $errstr, $errfile, $errline) { throw new ErrorException ($errstr, 0, $errno, $errfile, $errline); } set_error_handler("exception_error_handler");
  53. 53. Autoload (require/include) するための機構 クラスがなかったときに自動的に読み込む といっても読み込むための処理は自分で記述 する クラス名とファイル名の規則はアプリによって違うため <?php // これまでは使うやつ全部 require_once してた // 使うクラスも使わないクラスもとりあえず require_once 'class/ActionForm.php'; require_once 'class/Error.php'; require_once 'class/Util.php';
  54. 54. Autoload <?php function __autoload ($name) { require_once $name . '.php'; } $m = new PFIMembers(); // このクラスが定義されていない! // __autoload 関数が定義されている → 呼びだし // $name には PFIMembers (使おうとしたクラス) // がわたされる // 結果, PFIMembers.php が読み込まれる // PFIMembers クラスが定義される // インスタンスが生成される
  55. 55. SPL Standard PHP Library いろいろなデータ構造のためのクラスや インターフェースを提供 日の目を見ない だれかつかってんの? ZFとかで地味に使われてたり spl_autoload* くらい
  56. 56. SPL (spl_autoload_register) autoload をもっと使いやすくする autoloadスタック 複数のautoload関数を登録できる 1つ目でクラスが読み込めなかったら次の関数 を... メソッドもOK MyAutoload::load とか array($my_autoload_instance, 'load') とか
  57. 57. SPL (spl_autoload_register) class Al { public static function load($name) { $fn = $name . ".php"; if (file_exists($fn)) require_once $fn; } public static function loadClass($name) { $fn = $name . ".class.php"; if (file_exists($fn)) require_once $fn; } } spl_autoload_register('Al::load'); spl_autoload_register('Al::loadClass');
  58. 58. SPL (spl_autoload_register) class Al { public static function load($name) { $fn = $name . ".php"; if (file_exists($fn)) require_once $fn; } public static function loadClass($name) { $fn = $name . ".class.php"; if (file_exists($fn)) require_once $fn; } } spl_autoload_register('Al::load'); spl_autoload_register('Al::loadClass');
  59. 59. SPL SplPriorityQueue とか 5.3 SplMinHeap とか RecursiveDirectoryIterator とか OutOfRangeException とか ..... まああんま使われてないですけどね FYI:こんど勉強会でこのネタやる (12/15)
  60. 60. SimpleXML PHPでXML扱うならコレ libxml2 のラッパー とにかくとりあえず便利 要素にプロパティとしてアクセス可能 xpathが使える htmlにも使える (DOMとして読み込ませて SimpleXMLに変換) ただし,xmlを一気に全部パースするため, 巨大なxmlにはむかない
  61. 61. SimpleXML <?php $url = 'http://twitter.com/statuses/public_timeli ne.rss'; $s = simplexml_load_file($url); foreach ($s->xpath('//item/title') as $t) { echo $t, PHP_EOL; } PurpleTyger9: just started playing Halo 3. http://raptr.com/marioa9 Kell_Christie: I REMEMBER WHEN WE BOOKED @nickiminaj BACK AT LA RUMBA IN THE SUMMER!!!ZzzzZZoooOOOOooo SHE'S A REAL SHOWSTOPPER :-) GemCrowley: @Princess_Zo You should come. $4 drinks 02PERSONS: @justinbieber so tomorrow at 7? ;D RuoXO: @hushiana セイクリッド2ってタイトルは聞いたことあるけど、面白いのか。 ... ちょっと調べてみよう(`・ω・´)
  62. 62. DateTime どの言語でも悩ましい日付の扱い 日付を扱うクラス 5系から導入され,徐々に機能拡張 タイムゾーン 日付差分 (DateInterval) 5.3 対比: date 関数群 関数いろいろ 2038年の越えられない壁 Unix Timestamp を基準
  63. 63. DateTime $dt = new DateTime(); $dt->format('Y-m-d H:i:s'); デフォルトで今 $dt->setTimeZone(new フォーマット DateTimeZone('America/New_York'); $dt- タイムゾーン変更したり(時差計算いらず!) >add(DateInterval::createFromDateStering('3 year 4 month 5 day 20 hour 40 min')); 3年4カ月5日20時間40分後に移動したり
  64. 64. DateTime $time = new DateTime(); echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo')) ->add(DateInterval::createFromDateString('1 month')) ->format('Y-m-d H:i:s'), PHP_EOL; echo $time->setTimeZone(new DateTimeZone('America/New_York')) ->format('Y-m-d H:i:s'), PHP_EOL; echo $time->setTimeZone(new DateTimeZone('Asia/Tokyo')) ->add(DateInterval::createFromDateString('9999 year 1 month 5 days')) ->format('Y-m-d H:i:s'), PHP_EOL; 2009-12-26 16:48:06 2009-12-26 02:48:06 12009-01-31 16:49:23
  65. 65. 名前空間 5.3 名前空間の定義 namespace hoge; 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); ¥
  66. 66. 名前空間 5.3 名前空間の定義 namespace hoge; れたPHPer 優れた 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); 2008/12 えええっ, 「えええっ,エンマー クになったの!? クになったの!? PHPオワタ ...」 オワタ 」 ¥ 2009/11 かわいいよエン. 「円かわいいよエン. バクスラもかわいい よ」
  67. 67. 名前空間を使う <?php // hoge.php namespace hoge; class foo { function __construct(){ echo __CLASS__, PHP_EOL; } } <?php require 'hoge.php'; $h = new hoge¥foo(); hoge¥foo
  68. 68. 複数の名前空間を1ファイルに定義 <?php // hoge.php namespace hoge { class foo { function __construct(){ echo __CLASS__, PHP_EOL; } } } // namespace hoge namespace fuga { ... } // namespace fuga
  69. 69. 名前空間は使うべきか? メジャーなフレームワークの次期次期 バージョンくらいでは,すでに名前空間 付きで開発が始まっている ゆるやかに移行していくでしょう まあでもしばらく5.2環境のところも多い でしょう
  70. 70. おまけ:5.3から使える機能もう一つ 5.3 みんな大好き三項演算が,さらに簡単に なりました function get_value() { // なんかのリソースからデータもってくる return array(1,2,3); } $hoge = get_value()?:null; var_dump($hoge);
  71. 71. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. Cake3 が別フレームワークにfork Zend Framework 世界的にシェアNo1? 書く量の減らないドMフレームワーク symfony というかいわゆるライブラリ郡 これも利用者多い Ethna 大規模向け.かっちりしてる. 僕メンテナー rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 大本命の超変態フレームワーク すごい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
  72. 72. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. ちょろっと Cake3 が別フレームワークにfork つかいたい Zend Framework 世界的にシェアNo1? 俺は 書く量の減らないドMフレームワーク つかわない symfony というかいわゆるライブラリ郡 これも利用者多い かっちり Ethna 大規模向け.かっちりしてる. つくりたい 僕メンテナー どんどん rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 使えば良い 大本命の超変態フレームワーク すごい つかいたい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.
  73. 73. まだモダンには程遠いんですけど たぶん時間がないので割愛させていただ く内容: 無名関数 $h = function() { ... }; Phar その他
  74. 74. PHPをとりまく環境 しっといて損はない
  75. 75. PEAR / Openpear / pecl PEAR / Openpear Openpear は PEAR をもっと使いやすくするために nequal が作った (主に @riaf) CodeRepos みたいなもん. % pear install –a services_twitter-beta http//openpear.org/ http://pear.php.net/ pecl はそれの拡張機能版 とりあえず APC いれとく 開発環境なら xdebug も入れる % pecl install apc http://pecl.php.net/
  76. 76. phpman PHP コマンドラインで使えるPHPリファレンス http://openpear.org/package/phpman 拙作 % pear install openpear/phpman % pera run-scripts openpear/phpman % phpman fopen
  77. 77. phpall 全バージョンの PHP の挙動を一気にため す http://d.hatena.ne.jp/hnw/20090110 % phpall '"0x1 == "1e0"' php-5.0.0: bool(true) php-5.0.1: bool(true) php-5.0.2: bool(true) php-5.0.3: bool(false) php-5.0.4: bool(false) ...
  78. 78. 数々の変態パッチ moriyoshi 氏による http://d.hatena.ne.jp/moriyoshi/20090905/125217 7259 echo new DateTime()->format(); Boost.PHP http://d.hatena.ne.jp/moriyoshi/20080323/12062963 85 Goっぽい魔改造 http://d.hatena.ne.jp/moriyoshi/20091114/12582041 28 [$ch] <- $i++;
  79. 79. PHP界に降臨する3人の神(多神教) masaki fujimoto mbstring 元祖神 moriyoshi koizumi グリーとEthna の親 変態神(PHPに限らず) なんでもできる人 masahiro takagi もうなんなの ドキュメント神 PHP 以外にもいろいろ(表彰されたし) 超速翻訳
  80. 80. コミュニティ PHP PHPユーザ会 毎月のPHP勉強会 http://events.php.gr.jp/ 年一度 PHP 勉強会 その他各フレームワーク・CMSでコミュ ニティが乱立 最近は CakePHP がデカい (勉強会/カンファレ ンスなど) cf. http://twitter.com/sotarok/phper
  81. 81. TIPS 優れたPHPerになるための三大条件 受け入れる 名前空間区切りが ¥ → いつのまにか可愛く見えてきた 求めない 「なんで三項演算の結合が ...」 → きっとだれかがそうしたかったのさ 楽しむ 「またひげのおじさんがなにか言ってるよw」
  82. 82. ご静聴ありがとうございました

×