前回記事の対応で、現在稼働しているCakePHP3のシステムのPHPバージョンを5.6->7.1に上げる事を検証した際に、CakePHP3の仕様に依存するWarningが見つかったので共有します。
検証環境
- CentOS 6.8(on Vagrant)
- PHP7.1.0
- CakePHP3.3.3
エラー内容
Cake\I18n\Time
をロードしたバッチを起動した際に、以下のWarningメッセージが出力されます。実行内容には影響は出ません。
Warning Error: Declaration of Cake\Chronos\Traits\FrozenTimeTrait::setTime($hours, $minutes, $seconds = 0) should be compatible with DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL) in [/vagrant/repos/vendor/cakephp/chronos/src/Date.php, line 24]
原因
PHP7.1で、Datetimeクラスがマイクロ秒に対応し、メソッドのインターフェースが変わったことが要因です。
- 継承元
DateTimeImmutable::setTime($hour, $minute, $second = NULL, $microseconds = NULL)
- 継承先
public function setTime($hours, $minutes, $seconds = 0)
{
return parent::setTime(0, 0, 0);
}
4番目の引数として$mictoseconds=NULL
が追加されているため、継承元とメソッド構造が異なってますよ、ということですね。(とはいってもデフォルト引数なので動作自体には問題はないと思われます)
今回出た警告は上記のfrozenTimetrait.php
での物ですが、7.1で全般的にマイクロ秒対応したとのことなので、実際はもっと沢山の箇所で同様の警告が出ることが予想されます。
参考
(PHPのドキュメントで具体的に7.1のDatetimeクラスの仕様ページがあった気がするのですが、見つからなくなってしまいました・・・。もし見つけた方はコメントください)
そもそもCakePHP3.3.3ではPHP7.1には正式対応していないっぽい
- 公式ドキュメントを色々と当たってみたのですが、CakePHP3そのものや、
chronos
関係でPHP7.1に対応したというリリースログは見当たりませんでした。明言はされていませんが、 2017/1/19現在、CakePHPはPHP7.1に対応していない と判断するのが妥当なのかな、と思われます。(こちらも公式で言及している部分を見つけた方がいましたらコメントください)
結論
CakePHP3でPHP7系を使用したい場合、特にプロダクトで使う場合はバージョンはPHP7.0で止めた方が無難である。