PHP開発では、プログラムの実行中に変更されることを意図していないパラメーター、ステータス値、およびその他のデータを構成するために定数がよく使用されます。 PHP 5.3以来、名前空間の導入により、コード組織とモジュラー機能が大幅に改善されました。しかし、実際的な問題も続きます。特定の名前空間で定義されているすべての定数を取得する場合、PHP自体は名前空間の定数をフィルタリングする機能を直接提供しません。この時点で、 get_defined_constants()は、詳細な研究に値するツールになります。
get_defined_constants()関数は、現在のスクリプト内のすべての定義された定数を含む連想配列を返します。ブールの真のパラメーターを渡すことにより、分類(ユーザー定義の定数を含む)をグループ化することもできます。
$constants = get_defined_constants(true);
print_r($constants['user']); // すべてのユーザー定義の定数を取得します
これは、最初にPHPコア定数、拡張定数、その他の無関係なコンテンツを除外するのに役立ちますが、名前空間によって分解するには十分ではありません。
名前空間で定義された定数は、実際にはPHP内のグローバル定数として存在しますが、名前空間のプレフィックスが含まれていることを除きます。例えば:
namespace App\Config;
const TIMEOUT = 30;
get_defined_constants()によって返される結果のこの定数のキー名は、app \ config \ timeoutです。したがって、通常のマッチまたは文字列のプレフィックス判断により、返品結果から関心のある定数を除外できます。
これは、ユーザー定義の定数から特定の名前空間に属する部品を除去する単純な関数です。
function get_namespace_constants(string $namespace): array {
$allConstants = get_defined_constants(true);
$userConstants = $allConstants['user'] ?? [];
$namespacePrefix = trim($namespace, '\\') . '\\';
$filteredConstants = [];
foreach ($userConstants as $name => $value) {
if (strpos($name, $namespacePrefix) === 0) {
$filteredConstants[$name] = $value;
}
}
return $filteredConstants;
}
コール例:
print_r(get_namespace_constants('App\\Config'));
この関数は、次の構造と同様の配列を返します。
Array
(
[App\Config\TIMEOUT] => 30
[App\Config\RETRIES] => 5
)
定数を最初に定義する必要があります
get_defined_constants()は、呼び出し前に定義された定数のみを取得できます。これは、対応するファイル(または名前空間)がロードされていることを確認する必要があることを意味します。
命名仕様<br> 複数の名前空間に一定の名前が重複している場合、フィルタリングはフルネーム(名前空間を含む)に依存し、競合はありません。
ツール機能またはクラスの方法としてカプセル化することができます<br> モジュールまたは名前空間の下で定数を取得する必要があることが多い場合は、上記のロジックを一般的なツールクラスにカプセル化して、コードの再利用性を向上させることもできます。
一部のフレームワークまたはカスタムフレームワークでは、定数を構成アイテムの代替またはサプリメントとして使用できます。自動構成登録は、 get_namespace_constants()と組み合わせて実装できます。例えば:
$config = get_namespace_constants('App\\Config');
file_put_contents('https://m66.net/log/config_snapshot.json', json_encode($config));
このようにして、構成スナップショットを保存したり、操作やメンテナンスやトラブルシューティングを簡単にするためにリモートシステムに送信できます。
PHPは、名前空間で定数をリストするネイティブ機能を直接提供していませんが、名前空間プレフィックスルールを使用してget_defined_constants()を使用することにより、この要件を達成できます。このようなスキルを習得すると、コード組織の機能が向上するだけでなく、フレームワーク開発または大規模システムの実際の価値を完全にプレイします。