PHP5と7の留意点メモ

今さらながらPHP5.6に対応するように書き変える作業をする前に、その次の7を見据えないといけない(笑)
PHP: 下位互換性のない変更点 - Manual

  • PHP 5 と PHP 7 の両方で動くハンドラを書く場合は、ハンドラで型宣言をしてはいけません

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* 系のすべての関数

posix系廃止でperl互換に統一か。…使っていそう。

データベース系はパッケージ化されているはずだったな。

  • (廃止)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 タグの廃止

地味な話だが、意外と困る人もいるだろう。

  • 非互換のコンテキストからの呼び出しの削除

古い仕様の方がおかしいな。

ジェネレーターの構文を使ったことがない。

  • 同じ名前のパラメータをひとつの関数に複数定義できない

例文を見て一体なぜ複数定義することがあるのか分からなかった。というか、どういう動作をするのだ?

  • 引数を調べる関数は、パラメータのその時点での値を報告する

用途によっては困るかも。だが逆に「その時点での値を知る方法」がなかったのか。

  • Switch 文に複数の default ブロックを書けない

元が意味不明。

  • $HTTP_RAW_POST_DATA の削除
  • INI ファイルにおける # 形式のコメントの削除

セミコロンを使え、とのこと。

  • JSON 拡張モジュールが JSOND に置き換わる
  • 内部関数がオーバーフローしたときの挙動

浮動小数点数値が大きすぎて整数として表せない場合に、 float から integer に変換した結果を黙って切り詰めていました」するな(笑)

  • カスタムセッションハンドラの戻り値の修正
  • 同値な要素の並び順

「その並び順がいつまでも同じであるとは限りません。」