PHPアプリケーションを開発する場合、さまざまな拡張機能によって提供される定数を使用します。たとえば、 Curl拡張子を使用する場合、 Curlopt_url 、 curlinfo_http_codeなどの定数を使用できます。ただし、サーバー環境が異なる場合があります。これらの定数が検出なしで直接使用される場合、対応する拡張が有効になっていないと、「未定義の定数」誤差がスローされる場合があります。
コードの堅牢性と互換性を向上させるために、PHPビルトイン関数get_defined_constants()を使用して、拡張子が特定の定数を定義するかどうかを確認できます。
get_defined_constants()関数は、現在のスクリプト内のすべての定義された定数を含む配列を返します。パラメーターが渡されると、PHPカーネル、拡張機能、ユーザー定義の定数など、分類によってグループ化された多次元配列を返します。
構文は次のとおりです。
array get_defined_constants ([ bool $categorize = false ] )
次のコードは、 curlopt_urlが定義されているかどうかを確認する方法を示しています。
<?php
$constants = get_defined_constants(true);
if (isset($constants['curl']) && array_key_exists('CURLOPT_URL', $constants['curl'])) {
echo "CURLOPT_URL 定義されています,安全に使用できます。";
} else {
echo "CURLOPT_URL 未定義,有効になっているかどうかを確認してくださいcurl拡張。";
}
このコードは、最初にすべての定数を拡張してグループ化し、次にCurlという名前のグループがあるかどうかを決定し、グループにCurlopt_urlがあるかどうかを確認します。
複数の定数が一度に存在するかどうかを検出する必要がある場合があります。上記のロジックを次のように拡張できます。
<?php
$required_constants = ['CURLOPT_URL', 'CURLOPT_RETURNTRANSFER', 'CURLOPT_TIMEOUT'];
$constants = get_defined_constants(true);
$missing = [];
foreach ($required_constants as $const) {
if (!isset($constants['curl'][$const])) {
$missing[] = $const;
}
}
if (empty($missing)) {
echo "すべてが必要ですcurl絶え間ない都定義されています。";
} else {
echo "以下がありませんcurl絶え間ない:" . implode(', ', $missing);
}
さまざまなクライアント向けにPHPシステムを展開していると想像してください。一部のクライアントは、環境に特定のPHP拡張機能を欠いています。定数の不足によって引き起こされるエラーを回避するために、定数を使用する前に統一チェックを行うことができます。
<?php
function is_constant_defined($extension, $constant_name) {
$constants = get_defined_constants(true);
return isset($constants[$extension][$constant_name]);
}
if (is_constant_defined('curl', 'CURLOPT_USERAGENT')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'MyAgent/1.0');
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/api/test');
curl_exec($ch);
curl_close($ch);
} else {
echo "現在の環境はそれをサポートしていませんCURLOPT_USERAGENT";
}
上記のコードでは、カプセル化関数is_constant_definedを使用して、一定の検出ロジックをより明確にし、より便利にします。
get_defined_constants(true)を使用して、現在の環境の拡張が特定の定数を定義するかどうかを効果的に検出します。インフラストラクチャチームの展開の違いであろうと、拡張バージョンの更新によって引き起こされる絶え間ない変更であろうと、この方法ではランタイムエラーを回避でき、システムの安定性を改善できます。