CakePHP3のControllerでDateTimeクラスを利用したら「Class ‘App\Controller\DateTime’ not found」となる原因と解決方法

投稿者: | ↻ : 2019年1月28日

CakePHP3のControllerクラス内でDateTimeクラスのインスタンスを生成しようとすると「Class ‘App\Controller\DateTime’ not found」となりインスタンスが生成できない。

原因はnamespaceが指定されているためスコープが変わり、「App\Controller」以下を探してしまい「App\Controller\DateTime」クラスが見つからないためエラーとなってしまう。

解決するにはクラス名を非修飾名(Unqualified name)から、完全修飾名(Fully qualified name)に変える。

名前空間と修飾名についてはPHPマニュアルの名前空間の使用法: 基本編を参照する。

  • 検証のための最小のコード(対応前):
    
    <?php
    namespace Foo\Bar; 
    date_default_timezone_set('Asia/Tokyo');
    $today = new DateTime();
    var_dump($today);
    
  • 実行結果:
    
    $ php code.php
    PHP Fatal error:  Class 'Foo\Bar\DateTime' not found in /Users/stupiddog/not-found-datetime/code.php on line 4
    
    Fatal error: Class 'Foo\Bar\DateTime' not found in /Users/stupiddog/not-found-datetime/code.php on line 4
    
  • 検証のための最小のコード(対応後):
    
    <?php
    namespace Foo\Bar; 
    date_default_timezone_set('Asia/Tokyo');
    $today = new \DateTime();
    var_dump($today);
    
  • 実行結果:
    
    $ php code.php
    object(DateTime)#1 (3) {
      ["date"]=>
      string(26) "2017-11-01 20:20:10.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(10) "Asia/Tokyo"
    }