質問: cakephp3でAppControllerを継承したコントローラのシングルトン化をしたいのですが、 ``` public function initialize() ``` を ``` private function initialize() ``` にすると、 > > Fatal error: Access level to App\Controller\TestsController::initialize() must be public (as in class App\Controller\AppController) > > > とエラーになってしまいます。 上記問題からinitialize()はprivateにできないと思うのですが、cakephpの構造上コントローラをシングルトンクラスにするのは不可能なのでしょうか。 追記: そもそもなんですが、php開発でシングルトンパターンって使ってますか?多言語のブログなどのぞくと、非オブジェクト指向的だとのご意見が多く、使っていきたいが、ためらっている状態です。(密結合だとかいうのはよく理解できないのですが。) そもそもコンストラクタがprivateなので、finalクラスにしか適応できなさそうだなと。でもLaravel5のソースとか見てると普通に使われてるんですよね、シングルトン。。
回答: 残念ながら、CakePHPの枠組みでは無理です。 コントローラーはCakePHP内部で、`ReflectionClass::newInstance`経由で作成されています(ソース)ので、コンストラクタを`private`としてシングルトン化しようとするとエラーになります。 ...というより、普通にCakePHPを書いていて**自力でコントローラーをインスタンス化する**場面なんてほぼ来ないので、シングルトン化しようがしまいが、実質的には何も変わらないと思います。