82
Modern Modern PHP Programming ~コピパーからの脱出~ PFI 社内セミナー by id:sotarok

Modern PHP Programming @ PFI Seminar

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Modern PHP Programming @ PFI Seminar

ModernModernPHPProgramming~コピパーからの脱出~

@ PFI 社内セミナーby id:sotarok

Page 2: Modern PHP Programming @ PFI Seminar

PHP� もっとも誤解されたプログラミング言語

� 最強のウェブ開発言語

� 簡単

� 速い

� かわいい

Page 3: Modern PHP Programming @ PFI Seminar

本日のお話の構成

� PHPの特徴PHP� PHPのソコソコ入門� 独断と偏見によるモダンPHP入門� 最近のPHPを取り巻く環境

� ※本文中の記号

� 5.3 のみ� お得情報 TIPS

5.3

Page 4: Modern PHP Programming @ PFI Seminar

これだけ抑えれば PHP の8割はOK!PHP の特徴 5 つ

Page 5: Modern PHP Programming @ PFI Seminar

PHPの特徴 (1)� ウェブ特化型プログラミング言語

� HTMLの中にプログラムロジックをかける� でも書かないでね (ぉ

Page 6: Modern PHP Programming @ PFI Seminar

PHPの特徴 (2)� なんでも入り

mathJSONXML

HTTP� なんでも関数

� なんでもバンドル

� ./configure –help� 362 行� --enable-hogeでだいたい入る

HTTPMySQL

...

� --enable-hogeでだいたい入る� 最近のLinux パッケージだと php5 でコア,

php5-mbstring でmbstring拡張,など機能単体でパッケージになっている

Page 7: Modern PHP Programming @ PFI Seminar

PHPの特徴 (3)� 神がかったドキュメント� 更新速すぎ

� 開発中機能とかもドキュメントがあったりする

� サンプルコードつき

� コメントつけられる

� 日本語訳速すぎ

� php.net/fopen� fopenがあればマニュアルにリダイレクト� なければ検索結果

TIPS

Page 8: Modern PHP Programming @ PFI Seminar

PHPの特徴 (4)� PHPer -> 「ぺちぱー」と読むPHPer -> � PHP -> 「ぺちぺ」と読む� phpize (コマンド) -> 「ぺちぱいず」と読む

Page 9: Modern PHP Programming @ PFI Seminar

PHPの特徴 (5)� PHP を disるとホッテントリ入りするTIPS PHP dis� PHPerは必ず釣れる� なぜか Perl の人も釣れる� なぜかほかの言語の人が大量に釣れる

� ここぞ!とばかりに「これだから PHP は ...」とのたまう (←おまえPHP何もわかってないだろ

Page 10: Modern PHP Programming @ PFI Seminar

とりあえず使ってみる

PHP ソコソコ入門

Page 11: Modern PHP Programming @ PFI Seminar

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

Page 12: Modern PHP Programming @ PFI Seminar

動かす

� % echo "<?php phpinfo(); " > /path/to/www/info.php

Page 13: Modern PHP Programming @ PFI Seminar

とりあえず書いてみる

<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>

Page 14: Modern PHP Programming @ PFI Seminar

とりあえず書いてみる

<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 ブロック

プログラムとして実行.

それ以外は出力される

Page 15: Modern PHP Programming @ PFI Seminar

余談

� 思わずかつての PHP っぽさを出すためにPHP HTMLの中にPHPコードと書いちゃったけど本当言うとこういうのはサンプルでも

出すべきじゃないとは思うんですよね,

「そういうのがPHPなんだ」という第一印象が根強くついてしまうからです.とい

うわけで今後は全部CLIのサンプルコードがでてきます.プログラミングPHPについての発表ですので!ウェブアプリに関し

ては興味があればまた聞いてください!

Page 16: Modern PHP Programming @ PFI Seminar

変数

� 常にドル

<?php<?php$_hogefuga = 1;

文文

<?php$hoge = 1;

� セミコロンで終わる

Page 17: Modern PHP Programming @ PFI Seminar

変数

� 常にドル

<?php閉閉閉閉じタグじタグじタグじタグ ?> はははは省略可能省略可能省略可能省略可能

というかむしろというかむしろというかむしろというかむしろ

ちなみに

<?php$_hogefuga = 1;

「「「「PHPのみがのみがのみがのみが記述記述記述記述されたファイルされたファイルされたファイルされたファイル」」」」

ではではではでは書書書書かないことがかないことがかないことがかないことが推奨推奨推奨推奨されるされるされるされる

((((不要不要不要不要なななな改行改行改行改行がががが出力出力出力出力されてしまうされてしまうされてしまうされてしまう危危危危

険性険性険性険性があるためがあるためがあるためがあるため))))

<?php$hoge = 1;

� セミコロンで終わる

Page 18: Modern PHP Programming @ PFI Seminar

自動定義変数/スーパーグローバル変数

� 自動的に定義される

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']); //環境変数

Page 19: Modern PHP Programming @ PFI Seminar

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

Page 20: Modern PHP Programming @ PFI Seminar

PHPの型� 初期化方法,変換関数などにより動的に�変わる

<?php$hoge = intval(1);$hoge = floatval($hoge);$hoge = strval($hoge);$hoge = strval($hoge);...

Page 21: Modern PHP Programming @ PFI Seminar

変数を見たい!

� var_dump関数var_dump� オブジェクトの中身も全部見れる

<?php$hoge = 1;var_dump($hoge);$hoge = "hoge";var_dump($hoge);var_dump($hoge);

int(1)string(4) "hoge"

Page 22: Modern PHP Programming @ PFI Seminar

演算子 (特徴的なもののみ)� 比較演算子 == / != / === / !==� エラー制御演算子@� 文字列結合 .� 型演算子 instanceof

Page 23: Modern PHP Programming @ PFI Seminar

比較演算子

� 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);

Page 24: Modern PHP Programming @ PFI Seminar

関数

� 関数

<?php

function add ($v1, $v2) {return $v1 + $v2;

}}

echo add(1, 2), PHP_EOL; // 3

Page 25: Modern PHP Programming @ PFI Seminar

文字列

� 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",));

Page 26: Modern PHP Programming @ PFI Seminar

配列

� 順序付きハッシュテーブル

� 添え字配列/連想配列→いっしょくた

� なんでも配列にする文化

<?php$array = array(

1, 2, 3,1, 2, 3,'hoge' => 1,4 => 4,'array' => array(1, 2, 3, 4,),

);

Page 27: Modern PHP Programming @ PFI Seminar

クラス

� 普通にクラスが定義できます

<?phpclass Hello{

public function greeting($name) {echo 'Hello ', $name, PHP_EOL;

}}}

$h = new Hello();$h->greeting('sotarok');

Page 28: Modern PHP Programming @ PFI Seminar

クラス定義についてもうちょっと

<?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;

}}

Page 29: Modern PHP Programming @ PFI Seminar

クラス定義についてもうちょっと2

� クラス定数

� const� const� プロパティの修飾

� public/private/protected� static

� メソッドの修飾

� public/private/protected� static

� クラス� クラス

� abstract� インターフェース

� interface / implements� スコープ定義演算子

� ::

Page 30: Modern PHP Programming @ PFI Seminar

クラス定義についてもうちょっと3

� $this キーワード$this � $this->prop� $this->method();

� クラス定数

� Hoge::PIYO;� メソッドのstatic呼びだし� メソッドのstatic呼びだし� Hoge::piyo();

� static 変数へのアクセス� Hoge::$static_prop = 5;

Page 31: Modern PHP Programming @ PFI Seminar

定義済みのなにか

� 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()));'

Page 32: Modern PHP Programming @ PFI Seminar

えーまだそんな書き方してるの?

古代の人? といわれないために.

独断と偏見によるモダンPHP入門

主な内容:

HTMLとロジックの分離オブジェクト指向

インターフェース

オーバーロード

例外・エラーハンドリング

AutoloadSPLSimpleXMLDateTime名前空間

フレームワーク

Page 33: Modern PHP Programming @ PFI Seminar

HTMLとロジックは分離

index.php(エントリーポイント) Library.php

Logic.php

View.htmlView.html

Page 34: Modern PHP Programming @ PFI Seminar

ライブラリ

� 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

Page 35: Modern PHP Programming @ PFI Seminar

オブジェクト指向

� メソッドチェイン

� アクセス修飾子

� インターフェース (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

Page 36: Modern PHP Programming @ PFI Seminar

メソッドチェイン

� (をするとモダンだよ,という意味ではなく,できるよ,というだけの話)

<?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();

Page 37: Modern PHP Programming @ PFI Seminar

インターフェース

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;}

Page 38: Modern PHP Programming @ PFI Seminar

インターフェース

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:遠藤綾

Page 39: Modern PHP Programming @ PFI Seminar

インターフェース

� いくつかの定義済みインターフェース

� Iterator� イテレート可能になる (foreachにわたせる)

� ArrayAccess� 配列的なアクセスが可能になる

� SPL インターフェース (後述)� SPL インターフェース (後述)

Page 40: Modern PHP Programming @ PFI Seminar

オーバーロード

� C++とかのオーバーロードとは違います� のまえに,マジックメソッドについて

� __ で始まるメソッド� なにかの条件のときに自動的に呼ばれるメソッド

� 例: __toString()� これが定義されていると,オブジェクトをstringとして呼んだとき(echoしたりとか),このメソッドが呼ばれる

Page 41: Modern PHP Programming @ PFI Seminar

マジックメソッド

� __construct / __destruct__construct / __destruct� __isset� __unset� __sleep / __awake� __clone

__invoke� __invoke� __get / __set / __call / __callStatic

Page 42: Modern PHP Programming @ PFI Seminar

__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 が呼ばれる → なにかしらの値が返ってくる

Page 43: Modern PHP Programming @ PFI Seminar

__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がどこかにセットされる

Page 44: Modern PHP Programming @ PFI Seminar

__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 が呼ばれる

Page 45: Modern PHP Programming @ PFI Seminar

__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 が呼ばれる

Page 46: Modern PHP Programming @ PFI Seminar

オーバーロードの使いどころ

� とにかくライブラリ作る人向けの機能

� でも使う人にも当然恩恵がある

� 必要なリソースの必要なときに確保する

class Hoge{

public function __call($name, $args) {public function __call($name, $args) {... $name をパースして呼びだすメソッドを動的に

変更

}}

Page 47: Modern PHP Programming @ PFI Seminar

__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,));

}}

Page 48: Modern PHP Programming @ PFI Seminar

__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 に存在したら,それに一致するレコードを取り出す」というメソッドを呼び出す

メソッドを自分で定義する必要がなく,レコード定

義さえわかれば,あたかもメソッドとして使える

Page 49: Modern PHP Programming @ PFI Seminar

例外

� try { ... } catch (Exception $e) { ... }� できるようになった!� できるようになった!

� 例外を発生させる

� throw new Exception("message");� 新しいライブラリ・フレームワークではすでに導入されている

� しかし ...� PHP本体が例外をはいてくれないので生煮え� -> ErrorExceptionで対応

Page 50: Modern PHP Programming @ PFI Seminar

例外使う

<?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);

}

Page 51: Modern PHP Programming @ PFI Seminar

PHPのエラーハンドリング� エラーハンドラを自分で定義して登録

� 挙動を変えられる� 挙動を変えられる

� set_error_handler('関数名');� エラーが発生すると,エラーコードとともにこの関数が呼ばれる

� フレームワークはだいたいこれでエラー制御

� ログに吐いたりアラーとメール飛ばしたり� ログに吐いたりアラーとメール飛ばしたり

� で,すべてのエラーをexceptionに投げなおすこともできる→ ErrorException

Page 52: Modern PHP Programming @ PFI Seminar

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");

Page 53: Modern PHP Programming @ PFI Seminar

Autoload� クラスがなかったときに自動的に読み込む

(require/include) (require/include) するための機構� といっても読み込むための処理は自分で記述する

� クラス名とファイル名の規則はアプリによって違うため

<?php<?php// これまでは使うやつ全部 require_once してた// 使うクラスも使わないクラスもとりあえずrequire_once 'class/ActionForm.php';require_once 'class/Error.php';require_once 'class/Util.php';

Page 54: Modern PHP Programming @ PFI Seminar

Autoload<?php

function __autoload ($name) {function __autoload ($name) {require_once $name . '.php';

}

$m = new PFIMembers();// このクラスが定義されていない!// __autoload 関数が定義されている → 呼びだし// __autoload 関数が定義されている → 呼びだし

// $name には PFIMembers (使おうとしたクラス)// がわたされる// 結果, PFIMembers.php が読み込まれる// PFIMembers クラスが定義される// インスタンスが生成される

Page 55: Modern PHP Programming @ PFI Seminar

SPL� Standard PHP LibraryStandard PHP Library� いろいろなデータ構造のためのクラスやインターフェースを提供

� 日の目を見ない

� だれかつかってんの?

� ZFとかで地味に使われてたり� ZFとかで地味に使われてたり� spl_autoload* くらい

Page 56: Modern PHP Programming @ PFI Seminar

SPL (spl_autoload_register)� autoloadをもっと使いやすくするautoload� autoloadスタック� 複数のautoload関数を登録できる� 1つ目でクラスが読み込めなかったら次の関数を...

� メソッドもOK� メソッドもOK� MyAutoload::load とか� array($my_autoload_instance, 'load') とか

Page 57: Modern PHP Programming @ PFI Seminar

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');

Page 58: Modern PHP Programming @ PFI Seminar

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');

Page 59: Modern PHP Programming @ PFI Seminar

SPL� SplPriorityQueueとかSplPriorityQueue� SplMinHeapとか� RecursiveDirectoryIteratorとか� OutOfRangeExceptionとか .....

5.3

� まああんま使われてないですけどね

� FYI:こんど勉強会でこのネタやる (12/15)

Page 60: Modern PHP Programming @ PFI Seminar

SimpleXML� PHPでXML扱うならコレ� libxml2 のラッパー� とにかくとりあえず便利

� 要素にプロパティとしてアクセス可能

� xpathが使える� htmlにも使える (DOMとして読み込ませて� htmlにも使える (DOMとして読み込ませて

SimpleXMLに変換)� ただし,xmlを一気に全部パースするため,巨大なxmlにはむかない

Page 61: Modern PHP Programming @ PFI Seminar

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ってタイトルは聞いたことあるけど、面白いのか。ちょっと調べてみよう(`・ω・´)...

Page 62: Modern PHP Programming @ PFI Seminar

DateTime� どの言語でも悩ましい日付の扱い

� 日付を扱うクラス

� 5系から導入され,徐々に機能拡張� タイムゾーン

� 日付差分 (DateInterval)

� 対比: date 関数群

5.3

� 対比: date 関数群� 関数いろいろ

� 2038年の越えられない壁� Unix Timestamp を基準

Page 63: Modern PHP Programming @ PFI Seminar

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分後に移動したり

Page 64: Modern PHP Programming @ PFI Seminar

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

Page 65: Modern PHP Programming @ PFI Seminar

名前空間

� 名前空間の定義

5.3

� namespace hoge;� 名前空間を指定してクラス(など)を呼び出す

� $h = new hoge¥piyo();

¥¥

Page 66: Modern PHP Programming @ PFI Seminar

名前空間

� 名前空間の定義

5.3

� namespace hoge;� 名前空間を指定してクラス(など)を呼び出す

� $h = new hoge¥piyo();

¥

優優優優れたれたれたれたPHPer

¥2008/12「「「「えええっえええっえええっえええっ,,,,エンマーエンマーエンマーエンマー

クになったのクになったのクになったのクになったの!?!?!?!?

PHPオワタオワタオワタオワタ ...」」」」

2009/11「「「「円円円円かわいいかわいいかわいいかわいいよよよよエンエンエンエン....

バクスラもかわいいバクスラもかわいいバクスラもかわいいバクスラもかわいい

よよよよ」」」」

Page 67: Modern PHP Programming @ PFI Seminar

名前空間を使う

<?php// hoge.phpnamespace hoge;namespace hoge;class foo {

function __construct(){echo __CLASS__, PHP_EOL;

}}<?php<?phprequire 'hoge.php';$h = new hoge¥foo();

hoge¥foo

Page 68: Modern PHP Programming @ PFI Seminar

複数の名前空間を1ファイルに定義

<?php// hoge.php// hoge.phpnamespace hoge {class foo {

function __construct(){echo __CLASS__, PHP_EOL;

}}}} // namespace hoge

namespace fuga {...} // namespace fuga

Page 69: Modern PHP Programming @ PFI Seminar

名前空間は使うべきか?

� メジャーなフレームワークの次期次期�バージョンくらいでは,すでに名前空間

付きで開発が始まっている

� ゆるやかに移行していくでしょう

� まあでもしばらく5.2環境のところも多いでしょうでしょう

Page 70: Modern PHP Programming @ PFI Seminar

おまけ:5.3から使える機能もう一つ

� みんな大好き三項演算が,さらに簡単になりました

5.3

なりました

function get_value(){

// なんかのリソースからデータもってくるreturn array(1,2,3);

}}

$hoge = get_value()?:null;var_dump($hoge);

Page 71: Modern PHP Programming @ PFI Seminar

フレームワーク (独断と偏見による)� CakePHP

� 世界でも日本でも大流行り.当然日本語での情報量も多い.

� Model が使いやすい.それ以外は嫌いだけど.� Cake3 が別フレームワークにfork� Cake3 が別フレームワークにfork

� Zend Framework� 世界的にシェアNo1?� 書く量の減らないドMフレームワーク

� というかいわゆるライブラリ郡

� symfony� これも利用者多い

� 大規模向け.かっちりしてる.

� Ethna� 僕メンテナー� 僕メンテナー

� グリーはこれで動いてる!(古いバージョンだけど)

� rhaco2� 大本命の超変態フレームワーク

� すごい

� その他もろもろ

� PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.

Page 72: Modern PHP Programming @ PFI Seminar

フレームワーク (独断と偏見による)� CakePHP

� 世界でも日本でも大流行り.当然日本語での情報量も多い.

� Model が使いやすい.それ以外は嫌いだけど.� Cake3 が別フレームワークにfork

ちょろっと

つかいたい

� Cake3 が別フレームワークにfork� Zend Framework

� 世界的にシェアNo1?� 書く量の減らないドMフレームワーク

� というかいわゆるライブラリ郡

� symfony� これも利用者多い

� 大規模向け.かっちりしてる.

� Ethna� 僕メンテナー

かっちり

つくりたい

俺は

つかわない

� 僕メンテナー

� グリーはこれで動いてる!(古いバージョンだけど)

� rhaco2� 大本命の超変態フレームワーク

� すごい

� その他もろもろ

� PHP 界隈にはクソみたいにフレームワークがあふれている.うんざり.

どんどん

使えば良い

つかいたい

Page 73: Modern PHP Programming @ PFI Seminar

まだモダンには程遠いんですけど

� たぶん時間がないので割愛させていただ�く内容:

� 無名関数

� $h = function() { ... };� Phar� その他� その他

Page 74: Modern PHP Programming @ PFI Seminar

しっといて損はない

PHPをとりまく環境

Page 75: Modern PHP Programming @ PFI Seminar

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/

Page 76: Modern PHP Programming @ PFI Seminar

phpman� コマンドラインで使えるPHPリファレンスPHP� http://openpear.org/package/phpman� 拙作

� % pear install openpear/phpman� % pera run-scripts openpear/phpman� % pera run-scripts openpear/phpman

� % phpman fopen

Page 77: Modern PHP Programming @ PFI Seminar

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)...

Page 78: Modern PHP Programming @ PFI Seminar

数々の変態パッチ

� 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++;

Page 79: Modern PHP Programming @ PFI Seminar

PHP界に降臨する3人の神(多神教)� masaki fujimoto� 元祖神� 元祖神

� mbstring� グリーとEthnaの親

� moriyoshi koizumi� 変態神(PHPに限らず)� なんでもできる人

� もうなんなの� もうなんなの

� masahiro takagi� ドキュメント神

� 超速翻訳

� PHP 以外にもいろいろ(表彰されたし)

Page 80: Modern PHP Programming @ PFI Seminar

コミュニティ

� PHPユーザ会PHP� 毎月のPHP勉強会 http://events.php.gr.jp/� 年一度 PHP 勉強会

� その他各フレームワーク・CMSでコミュニティが乱立

� 最近はCakePHPがデカい (勉強会/カンファレ� 最近はCakePHPがデカい (勉強会/カンファレンスなど)

� cf. http://twitter.com/sotarok/phper

Page 81: Modern PHP Programming @ PFI Seminar

優れたPHPerになるための三大条件

� 受け入れる

TIPS

� 名前空間区切りが ¥� →いつのまにか可愛く見えてきた

� 求めない

� 「なんで三項演算の結合が ...」� →きっとだれかがそうしたかったのさ� →きっとだれかがそうしたかったのさ

� 楽しむ

� 「またひげのおじさんがなにか言ってるよw」

Page 82: Modern PHP Programming @ PFI Seminar

ご静聴ありがとうございました