Recommended
FuelPHPで3種のprofilerを使ってみた
Good Parts of PHP and the UNIX Philosophy
PHP と SAPI と ZendEngine3 と
最新PHP事情 (2000年7月22日,PHPカンファレンス)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
15分でCakePHPを始める方法(Nseg 2013-11-09 )
omoon.org の裏側 〜FuelPHP の task 活用例〜
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
PHPの今とこれから2025 (PHP Conference Japan 2025)
PHPCON_TOKYO_2022_Bigginer.pptx
More Related Content
FuelPHPで3種のprofilerを使ってみた
Good Parts of PHP and the UNIX Philosophy
What's hot PHP と SAPI と ZendEngine3 と
最新PHP事情 (2000年7月22日,PHPカンファレンス)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
15分でCakePHPを始める方法(Nseg 2013-11-09 )
omoon.org の裏側 〜FuelPHP の task 活用例〜
PHP Now and Then 2012 at PHP Conference 2012, Tokyo Japan (in japanese)
Similar to Modern PHP Programming @ PFI Seminar PHPの今とこれから2025 (PHP Conference Japan 2025)
PHPCON_TOKYO_2022_Bigginer.pptx
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PHPの今とこれから2024 at PHP Conference Japan 2024
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Phpcon tokyo 20120_bigginer
Web デザイナーが身に付けておきたい定番スキル ーPHP 初級編ー
More from Sotaro Karasawa
PHP Source Code Search with PHP
openpearについて@楽天テクノロジーカンファレンス
Mockingbirdサーバサイド@拡張機能勉強会
Mockingbirdイベントハンドリング@拡張機能勉強会
Mockingbirdのタブバーの実装@拡張機能勉強会
Recently uploaded 論文紹介:"Reflexion: language agents with verbal reinforcement learning", "MA-LMM...
論文紹介:"MM-Tracker: Motion Mamba for UAV-platform Multiple Object Tracking", "M...
論文紹介: "Locality-Aware Zero-Shot Human-Object Interaction Detection" "Disentan...
論文紹介:Simultaneous Detection and Interaction Reasoning for Object-Centric Acti...
手軽に広範囲でプライバシーを守りながら人数カウントできる ~ LoRaWAN AI人流カウンター PF52 日本語カタログ
歴史好きのスクラム話 JBUG名古屋#5 AI時代のデータドリブンなプロジェクト管理
How We Operated Ticket-Driven Development in JIRA.pdf
LoRaWAN小売業DXソリューション ~天候データと人流カウンターを利用して売り上げアップに貢献!
Modern PHP Programming @ PFI Seminar 1. 2. 3. 4. 5. 6. PHPの特徴 (2) math JSON XML HTTP なんでも入り なんでも関数 MySQL なんでもバンドル ... ./configure –help 362 行 --enable-hoge でだいたい入る 最近のLinux パッケージだと php5 でコア, php5-mbstring で mbstring 拡張,など機能単体 でパッケージになっている 7. PHPの特徴 (3) 神がかったドキュメント 更新速すぎ 開発中機能とかもドキュメントがあったりする サンプルコードつき コメントつけられる 日本語訳速すぎ TIPS php.net/fopen fopen があればマニュアルにリダイレクト なければ検索結果 8. 9. PHPの特徴 (5) TIPS PHP を dis るとホッテントリ入りする PHPer は必ず釣れる なぜか Perl の人も釣れる なぜかほかの言語の人が大量に釣れる ここぞ!とばかりに「これだから PHP は ...」と のたまう (←おまえPHP何もわかってないだろ 10. 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. 13. 14. 15. 16. 17. 変数 ちなみに 常にドル 閉じタグ ?> は省略可能 <?php というかむしろ 「PHPのみが記述されたファイル」 のみが記述されたファイル」 のみが記述されたファイル $_hogefuga = 1; では書かないことが推奨 推奨される では書かないことが推奨される (不要な改行が出力されてしまう危 不要な改行が出力されてしまう危 されてしまう 険性があるため があるため) 険性があるため) 文 セミコロンで終わる <?php $hoge = 1; 18. 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. 21. 変数を見たい! var_dump 関数 オブジェクトの中身も全部見れる <?php $hoge = 1; var_dump($hoge); $hoge = "hoge"; var_dump($hoge); int(1) string(4) "hoge" 22. 23. 24. 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. 配列 順序付きハッシュテーブル 添え字配列/連想配列 → いっしょくた なんでも配列にする文化 <?php $array = array( 1, 2, 3, 'hoge' => 1, 4 => 4, 'array' => array(1, 2, 3, 4,), ); 27. 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. 30. 31. 32. 33. HTMLとロジックは分離 Logic.php index.php Library.php (エントリーポイント) View.html 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. オブジェクト指向 メソッドチェイン アクセス修飾子 インターフェース (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. メソッドチェイン (をするとモダンだよ,という意味ではなく, できるよ,というだけの話) <?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. インターフェース 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. インターフェース 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. 40. 41. 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. __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. __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. __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. 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. __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. 例外 try { ... } catch (Exception $e) { ... } できるようになった! 例外を発生させる throw new Exception("message"); 新しいライブラリ・フレームワークでは すでに導入されている しかし ... PHP本体が例外をはいてくれないので生煮え -> ErrorException で対応 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. 52. 53. Autoload (require/include) するための機構 クラスがなかったときに自動的に読み込む といっても読み込むための処理は自分で記述 する クラス名とファイル名の規則はアプリによって違うため <?php // これまでは使うやつ全部 require_once してた // 使うクラスも使わないクラスもとりあえず require_once 'class/ActionForm.php'; require_once 'class/Error.php'; require_once 'class/Util.php'; 54. Autoload <?php function __autoload ($name) { require_once $name . '.php'; } $m = new PFIMembers(); // このクラスが定義されていない! // __autoload 関数が定義されている → 呼びだし // $name には PFIMembers (使おうとしたクラス) // がわたされる // 結果, PFIMembers.php が読み込まれる // PFIMembers クラスが定義される // インスタンスが生成される 55. SPL Standard PHP Library いろいろなデータ構造のためのクラスや インターフェースを提供 日の目を見ない だれかつかってんの? ZFとかで地味に使われてたり spl_autoload* くらい 56. 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. 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. SPL SplPriorityQueue とか 5.3 SplMinHeap とか RecursiveDirectoryIterator とか OutOfRangeException とか ..... まああんま使われてないですけどね FYI:こんど勉強会でこのネタやる (12/15) 60. 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. 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. 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. 名前空間 5.3 名前空間の定義 namespace hoge; 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); ¥ 66. 名前空間 5.3 名前空間の定義 namespace hoge; れたPHPer 優れた 名前空間を指定してクラス(など)を呼び出 す $h = new hoge¥piyo(); 2008/12 えええっ, 「えええっ,エンマー クになったの!? クになったの!? PHPオワタ ...」 オワタ 」 ¥ 2009/11 かわいいよエン. 「円かわいいよエン. バクスラもかわいい よ」 67. 68. 69. 70. おまけ:5.3から使える機能もう一つ 5.3 みんな大好き三項演算が,さらに簡単に なりました function get_value() { // なんかのリソースからデータもってくる return array(1,2,3); } $hoge = get_value()?:null; var_dump($hoge); 71. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. Cake3 が別フレームワークにfork Zend Framework 世界的にシェアNo1? 書く量の減らないドMフレームワーク symfony というかいわゆるライブラリ郡 これも利用者多い Ethna 大規模向け.かっちりしてる. 僕メンテナー rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 大本命の超変態フレームワーク すごい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり. 72. フレームワーク (独断と偏見による) CakePHP Model が使いやすい.それ以外は嫌いだけど. 世界でも日本でも大流行り.当然日本語での情報量も多い. ちょろっと Cake3 が別フレームワークにfork つかいたい Zend Framework 世界的にシェアNo1? 俺は 書く量の減らないドMフレームワーク つかわない symfony というかいわゆるライブラリ郡 これも利用者多い かっちり Ethna 大規模向け.かっちりしてる. つくりたい 僕メンテナー どんどん rhaco2 グリーはこれで動いてる!(古いバージョンだけど) 使えば良い 大本命の超変態フレームワーク すごい つかいたい その他もろもろ PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり. 73. 74. 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. phpman PHP コマンドラインで使えるPHPリファレンス http://openpear.org/package/phpman 拙作 % pear install openpear/phpman % pera run-scripts openpear/phpman % phpman fopen 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. 79. 80. コミュニティ PHP PHPユーザ会 毎月のPHP勉強会 http://events.php.gr.jp/ 年一度 PHP 勉強会 その他各フレームワーク・CMSでコミュ ニティが乱立 最近は CakePHP がデカい (勉強会/カンファレ ンスなど) cf. http://twitter.com/sotarok/phper 81. 82.