そろそろPHP7が来る(仕事的に)頃合いかなと変更点を読んでいたら色々思うところがあったのでメモ。
自分で思ったことのメモ書きのため、変更点のすべてをカバーしているわけではありません。
Error(誤り)じゃなくException(例外)
エラーや例外の取り扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.error-handling
間違っている(Error)わけじゃない。ただこのシステムでは対応していない(Exception)というだけなのだ!
こういう考え方いいよね。
仕様に依存したあいまいな記述はやめよう
やりたいことははっきり書く。具体的に言えば括弧でくくる。
変数やプロパティ、メソッドへの間接的なアクセスの扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect
global は単純な変数だけを受け付ける
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.global
yield が右代入演算子に
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.yield
直観的に混乱するようなものはやっぱりやらないほうがいい
やがて消されるから。
list() の取り扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.variable-handling.list
Switch 文に複数の default ブロックを書けない
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.multiple-default
JSON 拡張モジュールが JSOND に置き換わる
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.json-to-jsond
非互換のコンテキストからの呼び出しの削除
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.incompatible-this
非 static メソッドに対する static 呼び出し
http://php.net/manual/ja/migration70.deprecated.php#migration70.deprecated.static-calls
配列のloopは参照のみと心得て、元の配列をどうにかしようとするときはそれ用の手続きを取ること
foreach の変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.foreach
なお、loop内でloop元の配列に変更を加えると、
- 処理が遅くなる(らしい)
- なにやってんだかわかりづらくなりコードのリーダビリティ上よくない
ので、これは以前から気をつけていたことのため、なにかに勝った気分
0除算はうっかりだってしないもの
ゼロ除算の挙動の変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.integers.div-by-zero
型の扱いは丁寧に
動的型付け言語だっていってもそこに甘えず気をつける。16進数と、10進数・文字列を、ごちゃまぜに扱わない
文字列の取り扱いの変更
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.strings
自分のコードの書き方は常にupdateしていこう
新しい書き方のほうがかっこいいってのもある
新しいオブジェクトを参照渡しで代入できない
http://php.net/manual/ja/migration70.incompatible.php#migration70.incompatible.other.new-by-ref
PHP 4 形式のコンストラクタ
http://php.net/manual/ja/migration70.deprecated.php#migration70.deprecated.php4-constructors
グローバル化進んでるなあ…
タイムゾーンとか言語とか
そろそろPHPでも型宣言する時代が来た
基本的にはいい話。
ただこれで生産性がどこまであがるのかあるいは下がるのか、ちょっとわからないなと思うところはある。
異なる型の戻り値を返すような処理を書いていた場合、どの段階でエラー出してくれるんだろう?(ドキュメントがあるみたいだけど読んでない)
Closure流行ってる?
- オブジェクトを継承しまくるのが古い時代来る?
- ふるまいを親クラスに持たせ、それを子クラスで継承して、一部の定義だけ書き換えというコーディングをよくやっていたんだけど、これ、処理の一元化とかコード数を減らすのには便利だったんですけど、外(処理の呼び出し元付近)から見たときに親までさかのぼらないとなにやってるかわかりづらいのが不便だったんですよね。
- オブジェクトに定義だけを持たせ、objectの使い方(ふるまい)はClosureで定義して実装するっていう感じになるのかな。
その他
- 宇宙船演算子(spaceship operater)という名前が猛烈かっこいい
- 中二的な意味で
- だけど実際のところこれ使うと読みにくくならないかが心配
- Null合体演算子
- ようこそ、君を待っていた
- define() を用いた配列定数の定義
- ようこそ、君を待っていた(その2)
全体的にはなんだかよさげな変更が多くて楽しみです。
同じ内容の処理でもかっこよく書けるとテンション上がりますよね。