定数を設定する方法がいくつかある
どれが最適か?
define
PHP言語構造による伝統的な宣言方法である。CakePHP の場合、以下の方法がある。
- bootstrap.php 内で、defineする。
- define を集めたファイルを bootstrap.php 内で、includeする。
- 通常MVC各ファイル内で、define することはしない。
メリット
- VSCodeのヒントが使用できる。
- arrayも使える。(PHP7 以降)
- 即時関数を使える。
デメリット
- アプリケーショングローバルなので、CakePHP の MVC デザインパターンを破壊しかねない。
- 使っていない定数でも常にメモリを確保される。
Configure クラス
定数ではないが、CakePHP の公式の構成クラスである。
(公式):https://book.cakephp.org/4/ja/development/configuration.html
メリット
- 読み書き・削除ができ、ファイルに保存ができる。
デメリット
- VSCodeのヒントが使用できない。
- 書き換えられる可能性がある。そもそも定数でない。
- アプリケーショングローバルなので、CakePHP の MVC デザインパターンを破壊しかねない。
静的クラス変数
定数専用のクラスを用意して、使いたいMVCファイル内で、use して使用する。
例) src/Constants というディレクトリを作成し、UtilConst.php ファイルを作成する。
<?php
declare(strict_types=1);
namespace App\Constants;
/**
* 定数
*/
class UtilConst
{
/**
* この場合は、 UtilConst::TEST_CONST で参照
*/
public const NO_HAS = 0;
public const HAS = 1;
/**
* この場合は、 UtilConst::TYPE_LIST [0] で参照
* 普通に、クラス内定数も使用可能。
*/
public const TYPE_LIST = [
self::NO_HAS => 'なし',
self::HAS => 'あり',
];
/**
* クラスなので、普通にメソッドも利用できる。
* この場合は、 UtilConst::getArray() で参照
*/
public static function getArray() : ?array
{
return [];
}
}
クラスを使用する側では use する。
use App\Constants\UtilConst;
class TestController extends Controller
{
dd( UtilConst::TYPE_LIST[UtilConst::HAS] ); // あり と表示される。
}
メリット
- VSCodeのヒントが使用できる。
- 名前空間を指定できる。
- 用途別にファイルを使い分けられる。コントローラーを継承して利用している場合、継承元で use しておけば、子クラスでも利用できるため、適用範囲を管理しやすい。
基底コントローラー内に定数を置いてもよいが、そうするとビュー側で参照しずらい。 - ビュー側でも use して使える。
デメリット
- 用途別に分けたり、ファイルが分散しないように内部的な規約を決めておかないと、混乱する可能性あり。
結論
静的クラス変数 を使うのが良さそう。