Contenu connexe
Similaire à なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
Similaire à なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い (20)
なぜ、PHPのmbstring.func_overloadをdeprecatedにするのに5年かかったのか? - 慢心、環境の違い
- 1. なぜ、 PHP の mbstring.func_overload
を deprecated にするのに 5 年
かかったのか? - 慢心、環境の違い
Y8 2017 spring in Shibuya
sasezaki
May 27, 2017
- 2. 2
目次
●
自己紹介
●
PHP のこれまで
●
PHP の仕組み と 拡張モジュール
●
PHP と 文字列
●
mbstring.func_overload の機能について
●
非推奨提案するに至った経緯 / 提案以降の話
●
5 年かけたことについての反省点
●
"mbstring.func_overload" と同じ事態を避けるには
●
まとめ
●
... おまけの話 ( 例えば文字列を避ける、 7.2 での他の deprecated)
- 14. 14
PHP 3 や 4 の初期 、みんな
mbstring を使っていたかというと・・・
➔
PHP 版の jcode もありましたが・・・
➔
※ PHP 3の頃は、前身として I18n Package というものだったようです。
(ext/mbstring/README_PHP3-i18n-ja)
1999 2003~
- 16. 16
さよなら PHP 6
●
5.3 リリース
●
register_globals , safe_mode, magic_quotes_gpc の非
推奨化 (E_DEPRECATED エラー )
●
バイナリセーフではない関数 (ereg, split)の非推奨化
●
GitHub の浸透も相まって ライブラリなど PHP でも開発が活
発に / CIの SaaS 台頭
2009 2012~
- 17. 17
~~ PHP 5.6そして PHP 7.0, 7.1~
●
5.5 - preg_replace()の /e 修飾子 (eval) が非推奨に
●
5.6 - iconvおよび mbstring の、エンコーディングに関する
オプションが非推奨に
●
PHP 7.0 リリース
●
スカラー型宣言 / 戻り値の型宣言 の導入
●
AST 導入
2013 2017~
- 24. 24
コア拡張
●
ストリーム (4.3 にて登場 )
●
Phar (5.3から組み込み )
●
SPL (5.3から組み込み )
・・・など
今となっては、当然存在するでしょ !
という機能も、過去にはビルド時に外せた
「これらは実際のところ拡張ではありません。 PHP の
コアに組み込まれており、 コンパイルオプションで
無効にすることはできません。」
http://php.net/extensions.membership
- 26. 26
外部拡張
●
各 DB 向けドライバ (MySQLi など )
●
Gettext
●
DOM
●
cURL
・・・など
「これらの拡張は PHP にバンドルされています
が、コンパイルするには外部ライブラリが
必要となります。」
http://php.net/extensions.membership
- 27. 27
PECL 拡張
●
V8js
●
SPL_Types /Data Structures
●
phtreads / 各イベント系 (libevent など )
●
mysqlnd_* 系
・・・など
ここまでが、 php.net にてマニュアルが
閲覧できるものです。
「これらの拡張は » PECL にあります。 また、
外部のライブラリを必要とするかもしれません。」
- 29. 29
PHP の しくみ / 拡張モジュール
PHP 自体でのフック・コード解析する余地がある。
開発者と利用者 ( コンポーネント開発者 ) が想定する
環境はコアとバンドルである。
- 31. 31
「 PHP では、 文字は 1 バイトと同じで
す。つまり、 256 個の異なる文字を使用可
能です。 これは、PHP が Unicode をネ
イティブにサポートしていないことも意味
します。」
http://php.net/language.types.string
- 37. 37
... あなたの PHP で書かれたプログラム
ソースではバイナリ操作って行います?
( バイナリ操作のために文字列関数使ってますか? )
- 38. 38
PHP と バイナリ操作と・・
●
画像処理 (GD, ImageMagick)
●
ファイル判定 (finfo)
●
password_hash などの パスワードのハッシュ (5.5)
●
random_bytes (PHP 7.0)
- 40. 40
もしかして、 PHP 6 の話 ですか?
https://www.slideshare.net/andreizm/the-good-the-bad-and-the-ugly-what-happened-to-unicode-and-php-6
- 42. 42
PHP と 文字列
PHP では低レイヤに関わる機能の多くを提供し
ている。
PHP で 文字エンコーディングに関わる操作を行
うときは、専用のモジュールが必要となる。
- 46. 46
「 mbstring では、 対応するマルチバイト文字対
応版の関数で既存の PHP 関数を オーバーロード
する機能をサポートします。関数のオーバーロード
を行うと、例えば substr() を PHP スクリプトで
コールした場合に、 mb_substr() が代わりにコー
ルされるようになります。 これにより、マルチバ
イト文字に対応しないアプリケーションの移植が容
易となります。」
php.net/mbstring.overload
- 59. 59
zf1 にて、各コンポーネントごとで PHP 環境の
差分対応のために横展開的な修正があったことから、
ユーティリティコンポーネント (ZendStdlib)
の開発気風が高まり、その一環で
マルチバイト対応の点から、
StringUtils の提案が行われます。
- 61. 61
メイン開発者の一人 Ben Scholzen の投稿
http://zend-framework-community.634137.n4.nabble.com/Environment-amp-StringUtils-td4559272.html
- 69. 69
... もちろん この2012 年 4 月の時点で
「 mbstring.func_overload やめた方が
良くない?」
が PHP 利用者に伝わる訳ではなく。。
- 70. 70
2012 年 5 月
https://github.com/reactphp/react/pull/27
- 76. 76
2013 年 10 月
「ユニコードについてのスライド up しました」、
という PHP 開発者のツイート
https://twitter.com/auroraeosrose/status/388380154713489409
- 85. 85
2016 年 2 月
7.1 に向け Deprecation の RFC 提案が出され
http://news.php.net/php.internals/91265
- 86. 86
2016 年 11 月
RFC は 7.2 向けの Deprecations に
http://news.php.net/php.internals/96993
- 87. 87
2016 年 11 月
非推奨の一つとして、 mbstring.func_overload が
リストに上がる
https://wiki.php.net/rfc/deprecations_php_7_2
- 90. 90
2016 年 12 月
・・ twig ではしれっと削除されてる
https://github.com/twigphp/Twig/commit/b09faf8
- 93. 93
Zend Framework 2 での ML でのやりとり、および日本人メ
ンテナーへの報告 (2012 年 ) から
internals での投票可決と master への反映まで
5 年の月日が経過していた。
※ PHP 7.2 はまだリリースはされていません。
➔なぜ 5 年かけてしまったのか?
➔5 年の歳月のうち取れた行動はなかったのか?
- 102. 102
2004 年 7 月
* Do not use gzip encoding if certain
string functions are overloaded by
mbstring extension (bug #1781)
- 110. 110
アプリケーション動作環境の前提条件 を制限する
●
動作時にチェックする ?
●
例 ) コンストラクタで extension のチェック
●
アプリケーション構築時の前提条件を制限する
●
プロビジョニングによる冪等性
●
フレームワークによる環境チェック
( 参考例 )SymfonyEnvironments
●
コンポーネント・インストール時の前提条件を制限する
●
Diagnostics
●
composer だと pre-install-cmd ?
- 111. 111
PHP でのコード解析 ( 基本 )
デバッガ・プロファイラ・ユニットテスト
Xdebug, phpdbg
静的解析
Reflection
tokenizer
PHPParser
AST (nikic/php-ast)
●
IDE, SaaS (scrutinizerなど ), 他の言語による解析ツール
- 119. 119
※ 資料『 PHP AST 徹底解説 ( 補遺 ) 』にて、該当箇所の
確認をします
PHP 7 での文字列最適化