LoginSignup
7
8

More than 5 years have passed since last update.

CakePHP3をPHP7.1で動かした場合、DateTime周りでWarningが出る

Last updated at Posted at 2017-01-19

前回記事の対応で、現在稼働している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)
  • 継承先
cakephp/chronos/src/trait/frozenTimetrait.php
    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で止めた方が無難である。

7
8
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8