Upload
rui-hirokawa
View
3.523
Download
0
Embed Size (px)
DESCRIPTION
Summary of recent activity in the PHP community, new feature of PHP 5.3, 5.4 and 5.5. This presentation is written by Japanese.
Citation preview
PHPPHPの今とこれから の今とこれから 20122012
日本PHPユーザ会 廣川 類
PHPカンファレンス2012
2012年9月15日(土)
ポスト5.3時代のコード
マイクロフレームワークSlimの例
モジュラーデザイン:名前空間、オートローダー
<?phprequire 'vendor/autoload.php';
$app = new \Slim\Slim();$app->get('/hello/:name', function ($name) use ($app) { $app->render('tpl1.php', array('name'=> $name));});$app->run();
[tpl1.php]Hello, <?= $name; ?>
[tpl1.php]Hello, <?= $name; ?>
Hello, taroHello, tarohttp://www.example.com/hello/tarohttp://www.example.com/hello/taro
ComposedComposed
無名関数無名関数
名前空間名前空間
PHP アンケート 2012
主に使っているPHPのバージョン1) PHP 4.x 2) PHP 5.0-5.1 3) PHP 5.2 4) PHP 5.35) PHP 5.4 6) 使ってない
PHPユーザ分布
引用: W3Techs.com, 2012/9/8版
77.9%
21.2%
4.0%1.2%0.9%0.6%0.2%
usage of server-side programming language (2012/9/8)
PHPASP.NETJavaColdFusionPerlRuby
54.3%
8.9%
7.0%
3.7%
3.3%
22.8%
Market Share of CMS
WordPressJoomlaDrupalvBulletinBloggerother
PHPユーザ分布
引用: W3Techs.com, 2012/9/8版
95.7%
4.3%
Version of PHP (2012/9/8, W3Techs.com)
PHP 5PHP 4
4.1%
58.6%
36.5%
0.7%
version of PHP 5 (2012/9/8, W3Techs.com)
5.1
5.2
5.3
5.4
バージョンを更新する/しない理由
・新機能/性能が魅力的
・セキュリティ/バグ修正
・サポート切れ
・新機能/性能が魅力的
・セキュリティ/バグ修正
・サポート切れ
・更新/確認の手間
・新機能/性能の魅力小
・周辺環境の更新が追いつかない
・更新/確認の手間
・新機能/性能の魅力小
・周辺環境の更新が追いつかない
更新する理由 更新しない理由
「開発リソースの有効活用」とサポートの両立が課題
PHPの歩み
・自動グローバル変数のデフォルト無効化・mbregex・zend-multibyte
2003 2004 2005 2006 2007 2008 2009
4.3・CLI・stream
4.4`02/12 `05/6
・バグ修正`08/8 (EOL)
2010
5.3`09/6
・名前空間・クロージャ・遅延静的束縛・GC改善・MySQLnd
5.5
PHP10周年
JPUG10周年
フレームワークAJAX
XMLW/S API
Web/DBセキュリティ
2011 2012PHPcon関西
PHPcon北海道
5.4・Traits- 速度改善- MB対応標準化- 組込みWebサーバ- レガシー機能削除
`12/36.0`10/3 キャンセル
・Unicode
・エンジン/OOP大幅強化:ZE2・XML対応強化(SimpleXML)・Webサービス(SOAP)・DB強化 (SQLite, MySQLi)
`10/12 (EOL)
5.0`04/7
5.1`05/11 5.2
`06/11
・メモリ/速度改善・入力フィルタ・速度改善
・PDO
スマフォ
開発のソーシャルコーディング対応
2012/3 ソースコードの管理をsubversionからgitへ移行
git.php.net → githubにミラー
RFC作成
投票
新機能
議論/更新
http://wiki.php.net/rfc
バグトラッカで検索
http://bugs.php.net
バグ修正
登録(チケット取得)
#12345
PHPソースをクローン
実装+テストコード作成
pullリクエスト発行
リクエスト受理/拒否
http://github.com/php/php-src
議論/更新
フレームワークと相互運用性
PHP 5.3時代のフレームワーク(名前空間)
ZF 2Symfony2FuelPHP 1.2
相互運用性interoperability
フレームワークA ORMクラスC
ViewクラスD
独自クラスE
フレームワークB
ViewクラスF
独自クラスE
ORMクラスCモジュラー
PHP-FIG と PSR
PHP Framework Interoperability Group (PHP-FIG) (以前: PHP Standards Working Group) 主要F/W関係者が参画: CakePHP, ZF,Symfony, ... PHP standards recommendation (PSR)を発行
PSR-0 :ファイル/クラス/名前空間の標準化:autoloader
PSR-1 : 基本的なコーディング標準
PSR-2 : コーディングスタイルガイド
http://www.php-fig.org/
プロジェクトをPSR準拠とする
効率的で柔軟な運用が可能に
PSR準拠とするには?
2.PHP_CodeSnifferで確認
1.PHP Coding Standards Fixer (http://cs.sensiolabs.org/) PSR-0~2準拠となるよう修正
$ pear install PHP_CodeSniffer$ cd /usr/share/php/CodeSniffer/Standards$ git clone https://github.com/klaussilveira/phpcs-psr PSR$ phpcs --config-set default_standard PSR
$ wget http://cs.sensiolabs.org/get/php-cs-fixer.phar
$ php php-cs-fixer.phar fix /path/to/dir
依存性マネージャ:Composer
パッケージマネージャ → dependency manager プロジェクト単位で複数/階層的な依存関係を解決
主要フレームワークに対応 : Symfony2, ZF, FuelPHP, ...
$ php composer.phar install
{ "require": { "twig/twig": "1.6.*", "slim/slim": "1.6.*", }}
composer.jsonの例
(デフォルト:バージョンをロック)
$ php composer.phar update
composer.jsonに依存性を記述composer.jsonに依存性を記述
パッケージのインストールパッケージのインストール
依存性を更新依存性を更新
オートローダとロックファイル(composer.lock)自動生成
PackagistPackagist::ComposerComposerによる配布による配布
http://packagist.org/statistics
PHP 5.4 改善/変更のポイント
速度改善:10%~15%
Mix-inライクな機能を実現:Trait
古い機能の削除:
register_globals, magic_quotes*, safe_mode* , ext/sqlite, ...
ZEマルチバイト標準化、mbstring機能強化
組込みWebサーバー: php -S localhost:8080
課題: APCのサポートがまだβ版
PHP 5.4でより速く、快適に
大幅に高速化、省メモリ化
Athlon II X4 640 3.0GHz, Ubuntu 12.04
PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50
1
2
3
4
5
6Zend/bench.php strcat(200000)
sieve(30)nestedloop(12)matrix(20)heapsort(20000)hash2(500)hash1(50000)fibo(30)ary3(2000)ary2(50000)ary(50000)ackermann(7)mandel2mandelsimpleudcallsimpleucallsimplecallsimple
実行
時間
[s]
PHP 5.4でより速く、快適に
大幅に高速化、省メモリ化
Athlon II X4 640 3.0GHz, Ubuntu 12.04PHP 5.2 PHP 5.3 PHP 5.4 PHP 5.50
5
10
15
20
25
30
35
40Zend/micro_bench.php $x = $f ? $f : tmp
$x = $f ? $f : $a
$x = $f ?: tmp
$x = $a ?: null
$x = $str[0]
$x = $hash['v']
$x = $GLOBALS['v']
$x = $_GET
$x = TEST
new Foo()
$x = Foo::TEST
$this->f()
empty($this->x)
isset($this->x)
$this->x--
$this->x++
--$this->x
++$this->x
$this->x += 2
$this->x = 0
$x = $this->x
Foo::f()
self::f()
empty(Foo::$x)
isset(Foo::$x)
Foo::$x = 0
$x = Foo::$x
empty(self::$x)
isset(self::$x)
self::$x = 0
$x = self::$x
int_func()
undef_func()
func()
empty_loop
実行
時間
[s]
PHP 5.4 でコード再利用:Trait
Trait: 単一継承の言語でコードを再利用する仕組み
実装の再利用( ≠ interface:実装を強制)
クラスや他のTraitとのメソッド名衝突を解決する仕組みが必要<?php trait A { public function show() {
echo 'Hello,',$this->getName(),'!'; } abstract public function getName(); }
class Base { /* 1 */ }
class Foo extends Base {use A;public function getName() { echo 'PHP'; }
}$obj = new Foo();echo $obj->show(); // Hello,PHP!
<?php trait A { public function show() { echo 'Hello,';} } trait B { public function show() {echo 'PHP!';} }
class Foo { use A, B { A::show insteadof B; B::show as showN; }}
$obj = new Foo();echo $obj->show() . $obj->showN();
リネームではなくエイリアス
PHP 5.4 で日本語の扱いが便利に
Zendエンジンマルチバイト対応標準化:バイナリ互換性改善
デフォルト文字コードがISO-8859-1からUTF-8に: default_charset, htmlspecialchars(), etc.
mbstring文字コード追加: 携帯絵文字(Unicode 6), etc.
◇ PHP構築時: --enable-zend-multibyte --enable-mbstring ◇ mbstring.script_encoding でスクリプト文字コード指定
PHP <= 5.3
◇ zend.multibyte = On で有効に ◇ zend.script_encodingでスクリプト文字コード指定
PHP 5.4
echo mb_ereg_replace_callback('(\S+)', function ($m) { echo strlen($m[0]);}, $str);
正規表現置換eオプション:セキュリティホールとなりやすい
mb_ereg_replace_callback()関数追加 → 置換文字列で コールバック関数を使用可能に
PCREにおけるpreg_replace_callback()に相当
PHP 5.4.1:コールバック関数による置換
$str = 'abc 123 #';echo mb_ereg_replace('(\S+)',"strlen('\\1')", $str, 'e');
PHP 5.5
リリース時期: 未定 (2013/3 ?)
PHP 5.3、5.4と比べて小幅な改訂となる可能性がある
目玉機能は、(今のところ) Generator
Generator
Generator:イテレータを関数で定義(Python) 例:ファイルの各行を処理: ファイル全体読込み→メモリが大量に必要
イタレータ定義:多くのコード記述が必要
配列全体を返すのではなく、値を生成するイタレータを返す
<?phpfunction xrange($start, $end, $step = 1) { for ($i = $start; $i < $end; $i += $step) { yield $i; }}
foreach (xrange(10, 20) as $i) { echo $i;}
(https://wiki.php.net/rfc/generators)
Nikita Popov17歳、ベルリン
10,11,....,20
finallyキーワード
(https://wiki.php.net/rfc/finally)
try { echo ”1"; throw new Exception("ex");} catch (Exception $e) { echo ”2";} finally { echo "#";}
finallyブロック:tryブロックから出る際に常に実行される
例外発生の有無によらない → クリンナップコードを記述
return等でクリンナップコードがバイパスされることを防止
12#
$hash = password_hash($password, PASSWORD_BCRYPT);
パスワード用ハッシュ
(https://wiki.php.net/rfc/password_hash) パスワードハッシュ用API
$key = hash_pbkdf2("sha512", $password, $salt, 5000, 16, true);$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,
$key, $data, MCRYPT_MODE_CBC, $iv);
PBKDF2: パスワードハッシュ用キーストレッチ
scrypt に基づく実装も提案されている
echo password_verify($password, $hash) ? "OK" : "NG";
crypt関数のラッパー:従来はsalt文字列を作るのが面倒だった
function randomHexString($length) { for ($i = 0, $s = ''; $i < $length; ++$i) { $s .= "0123456789abcdef"[mt_rand(0, 15)]; } return $s;}echo randomHexString(10);
その他の機能(1)
(https://wiki.php.net/rfc/constdereference)
echo ”123”[1]; echo [1,2,3][2];
ランダムな16進文字列を生成する例
配列/文字列定数の添字参照
foreach ($users as $user) { list($id, $name) = $user; echo “$id => $name”;}
foreach ($users as list($id, $name)) { echo “$id => $name”;}
foreachでリスト代入が可能に (https://wiki.php.net/rfc/foreachlist)
1e1384a471
2
3
PHPの成功と未来
学習が容易: 言語がシンプル、ドキュメントが豊富 - 多様な要求に応えつつ、わかり易さを保つことが必要
- 地道な活動が重要: ローカルなPHPカンファレンス、勉強会、等
進化を継続: Webの進化に対応し、必要十分な解を提供
- 開発者/貢献者の育成
- キラーアプリ(WordPressなど)の存在がキー
PHPは歯ブラシのようなもの。いつも使う役に立つシンプルなツールだけど、誰も歯ブラシのことなんて気にしないよね。PHPは「問題を解くためのシンプルなツール」なのさ。
(http://en.wikiquote.org/wiki/Rasmus_Lerdorf)Rasmus語録
PHPユーザ相互の情報交換およびコミュニティの健全な発展
設立趣旨
• 高性能Webミドルウエアへのニーズ増大• オープンソースソフトウエアの発展
背景
国内PHPユーザの増加
活動内容
ドキュメント整備
セミナー/イベント
メンバー/スタッフ国際化
http://www.php.gr.jp/Web
・PHPユーザ会員と思ったらメンバー・運営するのも楽しいかも
日本PHPユーザ会
(2000年4月発足)
php-users, php-dev, php-doc, phpug-admin
メーリングリスト