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