PHPでは、 get_defined_constants()は、ユーザー定義の定数とシステム定数を含む、現在定義されているすべての定数の配列を返す非常に実用的な関数です。デバッグまたは開発中に、それを使用して、プロジェクトで定義されている定数を確認します。ただし、プロジェクトのサイズが大きくなるにつれて、この関数を使用することも問題を引き起こします。
get_defined_constants()は、実際には、すべての拡張機能、システム定数、ユーザー定義の定数を含む、現在の実行コンテキストのすべての定数をスキャンする組み込み関数です。呼び出されると、PHPはすべての定数を保持するハッシュテーブルを内部的に繰り返し、結果を連想配列に戻します。
小規模なプロジェクトまたは開発のデバッグ中、このような操作のオーバーヘッドはごくわずかです。しかし、特に定義の数が非常に大きい場合(数千の定数など)、大規模なプロジェクトでは、 get_defined_constants()への複数の呼び出しが次の効果を持ちます。
CPU使用の増加:定数の配列全体を構築するには、処理時間がかかる場合があります。
メモリ消費量は高くなります。回復した配列は通常非常に大きく、より多くのメモリを消費します。
コードの維持の難しさ:関数が頻繁に呼ばれる場合、デバッグ中に本当に気にする定数を簡単に混同するのは簡単です。
完全な機能を確保しながらパフォーマンスの損失を減らすために、 get_defined_constants()を使用するための次のベストプラクティスが推奨されます。
次のような構成定数を設定できます。
define('DEBUG_MODE', true);
その後、条件付きで使用します。
if (DEBUG_MODE) {
$constants = get_defined_constants(true); // オプションのパラメーター true 定数を分類します
print_r($constants['user']);
}
これにより、 get_defined_constants()がデバッグ中にのみ使用され、実稼働中に表示されないことが保証されます。
実行時に一定の情報を読む必要がある場合は、APCU、Redis、ファイルキャッシュなどのキャッシュメカニズムを使用して、繰り返し呼び出しのオーバーヘッドを減らすことができます。例えば:
$cacheKey = 'defined_constants';
$constants = apcu_fetch($cacheKey);
if ($constants === false) {
$constants = get_defined_constants(true);
apcu_store($cacheKey, $constants, 300); // キャッシュ5分
}
このアプローチは、特に大きなCMSまたはフレームワークで定数が頻繁に変化しないシステム環境に適しています。
無関係な定数を通過する必要性を減らすには、均一なプレフィックスでカスタム定数を名前を付けることをお勧めします。
define('APP_CONFIG_DB_HOST', 'localhost');
define('APP_CONFIG_DB_PORT', 3306);
呼び出すとき、あなたはプレフィックスを含む定数を除外するだけです:
$userConstants = get_defined_constants(true)['user'];
$appConstants = array_filter($userConstants, function($key) {
return strpos($key, 'APP_CONFIG_') === 0;
}, ARRAY_FILTER_USE_KEY);
これにより、システムと拡張定数からのフィルタリングのパフォーマンス負担が回避されます。
構成アイテムやデータを整理しているだけの場合、定数を使用する必要はありません。構成配列またはクラス定数を使用して、より柔軟でスケーラブルになります。
class AppConfig {
const DB_HOST = 'localhost';
const DB_PORT = 3306;
}
グローバル定数と比較して、クラス定数はモジュラー設計により適しており、メンテナンスが容易です。
毎日の開発では、 get_defined_constants()の使用を制御する必要があります。
ループや高周波呼び出しロジックで繰り返し使用しないでください。
get_defined_constants(true)分類を使用した後、ユーザー定数のみがアクセスされます。
デバッグスイッチやキャッシュと相まって、パフォーマンスへの影響を大幅に減らすことができます。
一定の管理を構成クラスと構成ファイルに抽象化することは、最新の大規模なプロジェクト構造に沿っています。
get_defined_constants()は、強力ですが、誤用されやすい機能です。大規模なPHPプロジェクトでは、定数の使用、頻度、範囲を合理的に計画することが、プロジェクトのパフォーマンスと保守性を確保するための鍵です。適切に使用すると、デバッグおよび構成管理の右側のアシスタントとして機能できます。しかし、特に頻繁に呼ばれるビジネスコードで不適切に使用されると、パフォーマンスボトルネックの一部になる可能性があります。