PHP5と7の留意点メモ
今さらながらPHP5.6に対応するように書き変える作業をする前に、その次の7を見据えないといけない(笑)
PHP: 下位互換性のない変更点 - Manual
PHP5では諦めて型宣言しない。PHP7だとThrowableと書く。…型宣言しないのは教条的に嫌いなのだが。
- eval() のエラーハンドリングをする際には、catch ブロックを用意
例外を投げることがある。
- 変数やプロパティそしてメソッドへの間接的なアクセスを、厳密に左から右の順で評価するようになりました
むしろ今までの仕様の方が気持ち悪い。四則演算の結合規則みたいな明示的ルールがあったのだろうか。
- list() での変数の代入が、逆順ではなくなる
『どの順で行われるかに依存するコードは書かない』に従う。
- 空の list() の廃止
…何に使うのか分からなかった。
- list() は文字列変数を展開できなくなりました
『かわりに str_split() 』と書いてあって、むしろそんな処理がされていたことを知った。
- 参照による代入で自動的に作成した配列要素の並び順の変更
前の挙動をする意味が理解できない。まぁ連想配列の格納順に深い意味は本来ないのか。
- global は単純な変数だけを受け付ける
例文にあるような「メンバをグローバルにする」発想に付いていけない。『一般論として、単純な変数以外を global で使うことは推奨しません。』に同意する。
- foreach は内部の配列ポインタを変更しない
例文が何をしたいか分からなかった。
- 値渡しの foreach は、配列のコピーを使って操作を進める
個人的には予想外の事態が起こりにくくなるだけかな。(たぶん、性格的に自分でコピーを作ってから回す形にする。)
- 参照渡しの foreach の、反復処理の振る舞いを改良
予想外の事態を引き起こす変更だが、動的に何かするには必要だったりするのだよな。
- Traversable でないオブジェクトの反復処理
Traversableでない場合は参照渡しで反復処理したのと同じになるとあるので、要注意。
Traversableは「IteratorAggregate あるいは Iterator」を意味する抽象化らしい。型チェックで使うのか。
- 無効な形式の八進リテラル
パースエラーを出すようになる…って、最初からパースでエラーを出して下さい(笑)
- 負のビットシフト
エラーで良い(笑)
- 範囲外のビットシフト
Integerを超えると全てゼロになる…って、いままでの『環境依存』がこわすぎる。
- ゼロ除算の挙動の変更
ワーニングを出してfalseから、IEEE 754準拠で「 +INF、-INF あるいは NAN」。剰余計算だと例外を投げる。結構違う。
- 十六進数値形式の文字列は数値とはみなさない
自動変換の仕様変更。自動変換は極力信じないのが信条(笑)
- \u{ がエラーの原因になることがある
「Unicode コードポイントのエスケープ構文」とかぶる。
- (廃止)call_user_method() および call_user_method_array()
- (廃止)ereg* 系のすべての関数
データベース系はパッケージ化されているはずだったな。
- (廃止)intl のエイリアス
- (廃止)set_magic_quotes_runtime()
- (廃止)set_socket_blocking()
- (廃止)PHP-FPM における dl()
- (廃止)GD Type1 関数群
- (INI削除)always_populate_raw_post_dataとasp_tags
- (INI削除)xsl.security_prefs
- 新しいオブジェクトを参照渡しで代入できない
無名のオブジェクトみたいなものか。用途が分からない。
- 無効なクラス名、インターフェイス名、トレイト名
…それって今までは宣言できたのか(笑)というか、今も宣言できてしまうものがあるのか。objectとか宣言できちゃ駄目だろ。
- ASP タグと script タグの廃止
地味な話だが、意外と困る人もいるだろう。
- 非互換のコンテキストからの呼び出しの削除
古い仕様の方がおかしいな。
- yield が右代入演算子に
ジェネレーターの構文を使ったことがない。
- 同じ名前のパラメータをひとつの関数に複数定義できない
例文を見て一体なぜ複数定義することがあるのか分からなかった。というか、どういう動作をするのだ?
- 引数を調べる関数は、パラメータのその時点での値を報告する
用途によっては困るかも。だが逆に「その時点での値を知る方法」がなかったのか。
- Switch 文に複数の default ブロックを書けない
元が意味不明。
- $HTTP_RAW_POST_DATA の削除
- INI ファイルにおける # 形式のコメントの削除
セミコロンを使え、とのこと。
- JSON 拡張モジュールが JSOND に置き換わる
- 内部関数がオーバーフローしたときの挙動
「浮動小数点数値が大きすぎて整数として表せない場合に、 float から integer に変換した結果を黙って切り詰めていました」するな(笑)
- カスタムセッションハンドラの戻り値の修正
- 同値な要素の並び順
「その並び順がいつまでも同じであるとは限りません。」