View
3.524
Download
0
Category
Preview:
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
メーリングリスト
Recommended