Posted at

PHP5.6から7への変更点に見る、コーデイング上の私的注意事項メモ

More than 1 year has passed since last update.

そろそろ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でも型宣言する時代が来た

戻り値の型宣言

http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.return-type-declarations

基本的にはいい話。

ただこれで生産性がどこまであがるのかあるいは下がるのか、ちょっとわからないなと思うところはある。

異なる型の戻り値を返すような処理を書いていた場合、どの段階でエラー出してくれるんだろう?(ドキュメントがあるみたいだけど読んでない)


Closure流行ってる? 


  • オブジェクトを継承しまくるのが古い時代来る?

  • ふるまいを親クラスに持たせ、それを子クラスで継承して、一部の定義だけ書き換えというコーディングをよくやっていたんだけど、これ、処理の一元化とかコード数を減らすのには便利だったんですけど、外(処理の呼び出し元付近)から見たときに親までさかのぼらないとなにやってるかわかりづらいのが不便だったんですよね。

  • オブジェクトに定義だけを持たせ、objectの使い方(ふるまい)はClosureで定義して実装するっていう感じになるのかな。


その他


  • 宇宙船演算子(spaceship operater)という名前が猛烈かっこいい


    • 中二的な意味で

    • だけど実際のところこれ使うと読みにくくならないかが心配



  • Null合体演算子


    • ようこそ、君を待っていた



  • define() を用いた配列定数の定義


    • ようこそ、君を待っていた(その2)



全体的にはなんだかよさげな変更が多くて楽しみです。

同じ内容の処理でもかっこよく書けるとテンション上がりますよね。