徹底攻略!php5.4

96
徹底攻略!PHP5.4 OSC 2012 Hokk aido LOCAL PHP部 佐藤琢哉(nazo) 12616日土曜日

Upload: takuya-sato

Post on 13-Jul-2015

7.390 views

Category:

Technology


3 download

TRANSCRIPT

徹底攻略!PHP5.4OSC 2012 Hokk aido

LOCAL PHP部 佐藤琢哉(nazo)

12年6月16日土曜日

今あなたの目の前に立っている人について• 佐藤琢哉

• @nazo

• LOCAL PHP部 部長

• フリーランスやめました

• 結婚しました

• 自宅警備員

12年6月16日土曜日

PHPカンファレンス北海道

12年6月16日土曜日

超お願い

12年6月16日土曜日

LOCAL PHP部参加者募集中

•特に喋ってくれる人募集中!

•むしろ来年のOSCは代わりに喋るぜ!ってくらいで!

•来年のPHPカンファレンス北海道でも喋って!(あれば)

•詳細は「LOCAL PHP部」で検索!

12年6月16日土曜日

LOCAL PHP部• 隔月でPHPの勉強会を開催

• 次回は8月を予定

• 参加自体は誰でも可能

• 部員になる必要はない

• 誰でもイベントを主催できます

• このセッションもLOCAL PHP部 勉強会の一環

12年6月16日土曜日

過去のPHP部の活動

• PHPカンファレンス北海道

•開発環境対決!

• CakePHPハンズオン

•通常のセミナー形式

12年6月16日土曜日

勉強会に参加するとこんなにいいことが!• PHP仲間と知り合える

• 実務ではなかなか導入できない技術情報を知ることができる

• 肉が食える(かもしれない)

• PHP部で就職が決まりました!(結構ある)

• PHP部で結婚できました!(関係ない)

12年6月16日土曜日

さあ、君もLOCAL PHP部へ!

12年6月16日土曜日

おわり

12年6月16日土曜日

?12年6月16日土曜日

今日の内容

• PHPのここまで

• PHP5.4とは

• PHPのこれから

12年6月16日土曜日

大体どういう話なの?

•最近のPHPはこんな感じだよ!

• PHP悪くないよ!

• PHP使いやすくなってるよ!

12年6月16日土曜日

これまでのあらすじ

12年6月16日土曜日

平成時代に入り、最近の若者が、極端にPHPを嫌いになっていると言われています。

12年6月16日土曜日

あの国民的アイドルグループの派生グループのメンバーも、COBOL検定一級を持っていると

言いますが、PHPについては触れられていません。(C)CCBYSA 2010 OpenStreetMap.org contributors

12年6月16日土曜日

http://news.mynavi.jp/news/2012/06/14/146/index.html

統計調査でも、PHPの人気は下落傾向にあると言われています。

12年6月16日土曜日

これは、平成時代に入り、過剰PHP嫌い文明に突入したと言えます。

12年6月16日土曜日

しかし、本当に若者たちは、

PHPの今を知っているのでしょうか?

12年6月16日土曜日

PHP5.3のおさらい

12年6月16日土曜日

PHP5.3とは何だったのか

• namespace

•無名関数

• Phar• goto

12年6月16日土曜日

namespace• これまで名前空間がないために長いクラス名

になっていたPHP界に革命

• 先進的フレームワークもこぞって採用(Symfony2、FuelPHPなど)

• クラス名の管理が簡潔になった

• 過去の資産を使う場合は有効活用できないという難点

12年6月16日土曜日

無名関数• usortの引数をものすごく書きやすくなったという革命

• 元々$hoge();($hogeは文字列)で関数を呼べるので、使い所が難しい

• PHP5.4からtype hintingで指定できるようになったので、型の厳格化の一環としては便利になる

12年6月16日土曜日

Phar

• 5.2から一応使えたけど、5.3から組み込みになった

•ライブラリの配布が簡単

• Silexなどで採用

12年6月16日土曜日

goto

•絶対に!

•使っては!

•いけない!!!!!

12年6月16日土曜日

こうして、現代的な実装を手に入れたPHP

12年6月16日土曜日

これは、PHPの夜明けとも言える、革命的な進化でした

12年6月16日土曜日

しかし、我々にはPHP最大の不満が残されていました

12年6月16日土曜日

array()←めんどい

12年6月16日土曜日

PHP5.3で、array()を撲滅しようと働きかけていたが、当初は却下

12年6月16日土曜日

PHP5.3で不採用にされ、誰もが絶望の淵に立たされていました

12年6月16日土曜日

が、PHP5.3リリースの2年後、突如として再浮上

12年6月16日土曜日

そして、ついに!

12年6月16日土曜日

Interactive shell

php > $a = [1, 2, 3];php > var_dump($a);array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3)}

12年6月16日土曜日

こうして我々は、ついにarray()の呪縛から解放された

12年6月16日土曜日

class User extends AppModel { public $name = 'User'; public $validate = array( 'login' => array( 'alphaNumeric' => array( 'rule' => 'alphaNumeric', 'required' => true, 'message' => 'Alphabets and numbers only' ), 'between' => array( 'rule' => array('between', 5, 15), 'message' => 'Between 5 to 15 characters' ) ), 'password' => array( 'rule' => array('minLength', '8'), 'message' => 'Minimum 8 characters long' ),

こんなコードも…

12年6月16日土曜日

class User extends AppModel { public $name = 'User'; public $validate = [ 'login' => [ 'alphaNumeric' => [ 'rule' => 'alphaNumeric', 'required' => true, 'message' => 'Alphabets and numbers only' ], 'between' => [ 'rule' => ['between', 5, 15], 'message' => 'Between 5 to 15 characters' ] ], 'password' => [ 'rule' => ['minLength', '8'], 'message' => 'Minimum 8 characters long' ],

なんということでしょう

12年6月16日土曜日

これにより、タイプ数は5回も減り、全国の電力消費量が10%削減されたと言われます

(ウソです)12年6月16日土曜日

PHP5.4の目玉機能とも言える、

short syntax array

12年6月16日土曜日

これにより、平成時代にPHPが嫌われていた原因の一つである、「PHPは配列やハッシュを書くのにarray()とか毎回書くのだ

りーんだよpgr」という批判に対抗することができ

るようになりました。

12年6月16日土曜日

しかしこれはPHP5.4の進化の一つに過ぎません

12年6月16日土曜日

PHP5.4の大きな追加・変更

12年6月16日土曜日

トレイト• クラスの継承の制約を解消するための仕組み

• 特定のクラスに対し、継承関係を無視してメソッド、プロパティを追加できる

• 様々なクラスで使うメソッドなどを、継承関係を無視して追加することができるので、継承関係が簡潔になる

12年6月16日土曜日

<?phptrait logger { function log($var) { return error_log($var); }}class MyClass { use logger;

function myMethod() { $this->log("MyClass::myMethod"); }}$c = new MyClass();$c->myMethod();

12年6月16日土曜日

トレイトはこんなこともできる

•プロパティの定義

•可視性の変更

•名前の変更(エイリアス)

•トレイトの組み合わせ

•抽象メソッドを持つトレイト

12年6月16日土曜日

trait logger { public $x = 5;}class MyClass { use logger; function myMethod() { var_dump($this->x); }}$c = new MyClass();$c->myMethod();

プロパティの定義

12年6月16日土曜日

trait logger { public function write() { echo "logger"; }}trait writer { public function write() { echo "writer"; }}class MyClass { use logger, writer { writer::write insteadof logger; }}$c = new MyClass();$c->write(); // writer

同名の優先順位

12年6月16日土曜日

trait logger { public function log($var) { return error_log($var); }}class MyClass { use logger { log as private _log; } function myMethod() { $this->log("myMethod"); $this->_log("myMethod"); }}$c = new MyClass();$c->myMethod();// $c->_log(); // error

可視性の変更/エイリアス

12年6月16日土曜日

trait Hello { public function sayHello() { echo 'Hello '; }}trait World { public function sayWorld() { echo 'World!'; }}trait HelloWorld { use Hello, World;}class MyHelloWorld { use HelloWorld;}$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();

トレイトの組み合わせ

12年6月16日土曜日

trait Hello { public function sayHelloWorld() { echo 'Hello '.$this->getWorld(); } abstract public function getWorld();}class MyHelloWorld { use Hello; public function getWorld() { return 'Hokkaido!'; }}$o = new MyHelloWorld();$o->sayHelloWorld();

抽象メソッドを持つトレイト

12年6月16日土曜日

register_xxx/safe_mode/magic_quotes_xxx

の廃止• register_globals など

•magic_quotes_gpc など

• safe_mode 及び、関係する設定

•今時使ってないよね?

•古いコードを移植する時に手抜きできないので注意

12年6月16日土曜日

Array dereferencing

•関数の戻り値などでの配列をそのまま扱える

12年6月16日土曜日

<?phpfunction hoge() { return [1, 2, 3];}$a = hoge()[2];var_dump($a);

12年6月16日土曜日

newしたクラスにすぐアクセス

• (new foo)->bar();

12年6月16日土曜日

<?=の常時有効化• short_open_tagの設定とは関係なく

• <?=のみが常に有効なのであって、<?は有効にはならない

• XML宣言にも安心

• PHPをテンプレートエンジンにしているフレームワークなどで便利

12年6月16日土曜日

未設定時の文字コードがUTF-8に

•今まではISO-8859-1

• htmlspecialchars / htmlentities など

• default_charset•未設定のまま何となく動かしていた場合に変な挙動になる場合があるので注意

12年6月16日土曜日

built-in web server• PHP自体にWebサーバー機能が入った

• 開発するだけならApacheをインストールしなくてもできる

• ただし本番運用には向いていない

• mod_rewriteに依存している場合は厳しい

• ルーティング指定機能があるので、それに対応しているフレームワークなら利用可能(Symfony2など)

12年6月16日土曜日

使い方

• php -S localhost:8000 (-Sは大文字)

•カレントディレクトリがDocumentRootになる

•任意のDocumentRootにする場合は-tで指定

12年6月16日土曜日

ルータースクリプト•mod_rewriteの代わりになるもの

• php -S localhost:8000 router.php•どこにアクセスしても必ずrouter.phpを通るようになる

• router.php内でREQUEST_URIを見て分岐させる

12年6月16日土曜日

速度向上• 5.3と比べて、大体10%~20%向上

• WordPressでは25%近く高速になったという例も

• メモリ使用量も削減

• PHP側がボトルネックになっている環境であれば、とりあえず入れてみる価値あり

12年6月16日土曜日

これだけ覚えておけば普段使うには十分!

12年6月16日土曜日

その他細かい修正

12年6月16日土曜日

breakの引数に変数の禁止

• break $var; ←これが駄目

• break 1; ←これは可

•数字を指定すると、数字分のネストを抜けることができる機能(知ってた?)

• continueも

12年6月16日土曜日

2進数表記の追加

• 0b010101011

12年6月16日土曜日

htmlspecialcharsの引数に指定できる定数追加

• ENT_SUBSTITUTE / ENT_DISALLOWED / ENT_HTML401 / ENT_XML1 / ENT_XHTML / ENT_HTML5

• ENT_HTML5を指定しておくといいかも

12年6月16日土曜日

@の速度改善

•エラー制御の@

•あまり使わないほうがいいけど…

• 1.5倍ほど速くなったとか

12年6月16日土曜日

type hintingにcallableを追加

• function hoge(callable $f) {•無名関数を引数に指定できる

12年6月16日土曜日

対話入力モードの改善• php -a

• cli.pager

• lessとか指定できる

• cli.prompt

• 「php > 」 の「php」の部分を変更できる

• fatal errorになっても終了しない

12年6月16日土曜日

json_encodeの機能追加

• JSON_PRETTY_PRINT

• 見やすくする

• JSON_UNESCAPED_SLASHES

• スラッシュをエスケープしなくする

• JSON_UNESCAPED_UNICODE

• ユニコード文字列をエスケープしなくする

12年6月16日土曜日

http_response_code()

• httpのレスポンスコードを簡単に設定/取得できる

•今まではheader();でちゃんと指定しないといけなかったのが、数字の指定だけで全部やってくれる

12年6月16日土曜日

クラスの静的メソッドの呼び方

<?php

class Hoge { static function fuga() { echo 'a',PHP_EOL; }}

Hoge::{'fu'.'ga'}();12年6月16日土曜日

E_ALL に E_STRICT が含まれるように

•今までは E_ALL | E_STRICT

•これからは E_ALL のみ

•逆に E_STRICT を切りたい場合は

• E_ALL ^ E_STRICT

12年6月16日土曜日

文字列オフセットの指定方法

• $string = ‘hoge’;• $string[1][0]; がエラーにならなくなった

• Array dereferencing の副次作用かどうかは謎

• 意識して使う機会はないと思うが、挙動が変わるので注意

12年6月16日土曜日

mbstringの修正

•絵文字サポート

•ガラケー絵文字の相互変換が可能に

• SJIS-DOCOMOなど

• UTF-8のチェック強化

12年6月16日土曜日

CallbackFilterIterator

• 任意のIteratorに対し、コールバック関数を指定することにより、逐一処理ができる、新しいIterator

• RecursiveCallbackFilterIterator というのもある

• pure PHPでも実装できる内容なので、5.4以下用に同名のクラスを作って互換性を保つこともできる

12年6月16日土曜日

<?php

$iterator = new CallbackFilterIterator( new FilesystemIterator(__DIR__), function ($current, $key, $iterator) { return $current->isDir() && ! $iterator->isDot(); });

foreach($iterator as $v) { var_dump($v);}

12年6月16日土曜日

mysqli_result

• Traversable対応

• foreachで回せるようになった

• Iteratorではない(残念)

12年6月16日土曜日

$mysqli = new mysqli( 'localhost', 'root', '', 'test');

foreach( $mysqli->query( 'SELECT * FROM hoge' ) as $result) { var_dump($result);}

12年6月16日土曜日

PHP5.4のまとめ

12年6月16日土曜日

劇的ではないが確実な変更

• 5.3の時の無名関数やnamespaceほどのインパクトはない

•かゆいところに手が届く変更が多い

•高速化も重要

•トレイトは使い所が難しい

12年6月16日土曜日

各ディストリビューションの対応

• CentOSではremi-testリポジトリで入る

• UbuntuではDotdeb等から入れる

• Macでは「php5.4 osx」とかでぐぐると方法が出てくる

•つまり、まだ正式対応されているものは(おそらく)ない

12年6月16日土曜日

PHPのライフサイクル

• 5.2はもうサポートが終了している

• 5.3は来年の春くらいか?ただし5.2が結構長続きしたのでわからない

•原則として古いものを使い続けることは推奨されない

12年6月16日土曜日

互換性• レンタルサーバーとかは要注意(そう簡単に

アップデートされないだろうけど)

• むしろレンタルサーバーを運営している人が注意

• モダンな書き方をしていれば、それほど問題は発生しない

• 古い書き方が癖になっている人は大変

12年6月16日土曜日

PHPの今後

12年6月16日土曜日

PHP5.4.1~5.4.4の変更点

•基本的にバグ修正のみ

•安心して最新バージョンを使おう

12年6月16日土曜日

PHP5.4.3CGIモード関係の脆弱性• URLの末尾に?-sとか入れるとソースが見れた

• URLの末尾に?-dでパラメータを指定すると…

• コマンドラインオプションがURLで渡せてしまう

• PHP5.4.3/PHP5.3.13で修正済み

• レンタルサーバーの人は特に注意

12年6月16日土曜日

PHP5.4.4• crypt関数のセキュリティ問題の修正とか

• 64bit環境で「"9223372036854775808" == "09223372036854775808"」がFALSEになった

• 32bitの場合は「"9007199254740992" == " 9007199254740992"」

• そんなに目立つものはない

12年6月16日土曜日

PHP5.5はこうなる!?

• <?php タグを省略できるようになる!?

•エラーハンドリングの強化!?

•変数のtaint判定!?

• Autoboxing!?

•リフレクションの強化!?この内容は全て検討中のものです。

実装が決定されているものではないのでご注意下さい。12年6月16日土曜日

PHPタグを省略できるようになる!?

•全部がプログラムとして使われるPHPファイルの、先頭の<?phpを書かなくても良くなる(?)

•ファイルの拡張子を「.phpp」にするとそうなる(?)

この内容は全て検討中のものです。実装が決定されているものではないのでご注意下さい。

12年6月16日土曜日

変数のtaint判定!?

• $_GETとかの変数をそのままechoするとwarningなどを出すようにする(?)

•安全なプログラムが書きやすくなる(?)

この内容は全て検討中のものです。実装が決定されているものではないのでご注意下さい。

12年6月16日土曜日

Autoboxing!?•例えば、$a = 1;に対し、$a->foo();のように、クラスのように何かを呼び出すことができるようにする(?)

•そのために、プリミティブ型をラップするクラスを用意し、その変換方法を定義する(?)

この内容は全て検討中のものです。実装が決定されているものではないのでご注意下さい。

12年6月16日土曜日

新情報の先取り

• http://wiki.php.net/rfc

12年6月16日土曜日

PHP悪くないよ!

12年6月16日土曜日

「速度の向上」「他言語のいいところ採用」「セキュリティ面の強化」

12年6月16日土曜日

PHP先生の今後にご期待下さい

12年6月16日土曜日

おわり

12年6月16日土曜日