大規模なプロジェクトを開発したり、PHPを使用してレガシーシステムを維持したりする際に、さまざまな定義済み定数に遭遇することがよくあります。フレームワーク、ライブラリ、または構成ファイルによって設定される場合があり、コードをデバッグまたはリファクタリングし、これらの定数が定義されている場所を知りたいときに混乱することがよくあります。
PHPは、現在のスクリプト内のすべての定義された定数をリストする組み込み関数get_defined_constants()を提供します。しかし、残念ながら、定数が定義されているファイルまたは行を直接伝えません。この記事では、get_defined_constants()を使用して特定の定数のソースをすばやく見つけるのに役立つ簡単な間接手法を紹介します。
get_defined_constants()は、現在のすべての定数の名前と値を含む配列を返します。
print_r(get_defined_constants());
出力の結果は似ています。
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[MY_CUSTOM_CONSTANT] => abc123
...
)
ただし、これは「トレーサビリティ」のニーズを満たすことはできません。
「違いの比較」のアイデアを使用して、定数を定義するファイルを分析できます。
ターゲットファイルを含める前に、一定のスナップショットA : get_defined_constants()を1回記録します。
オブジェクトファイルを含める:必要または含めることを介して定数定数を定義したと思われるロードファイル。
記録定数スナップショットB :含めた後、 get_defined_constants()を再度呼び出します。
違い分析:スナップショットAとBの違いを比較すると、このファイルにどの定数が導入されたかを知ることができます。
ここに完全な例があります:
<?php
// 最初のステップ:初期定数リストを記録します
$before = get_defined_constants();
// ステップ2:疑わしいドキュメントを紹介します
require_once 'https://m66.net/includes/config.php';
// ステップ3:インポートされた定数リストを記録します
$after = get_defined_constants();
// ステップ4:新しく導入された定数を分析します
$newConstants = array_diff_assoc($after, $before);
echo "新しく定義された定数は次のとおりです:\n";
print_r($newConstants);
このコードを実行した後、 config.phpで定義されている新しい定数が表示されます。 「定義行番号」を直接取得することはできませんが、このファイルがこれらの定数を導入することを明確に述べることができます。
定数がファイルで定義されていることを確認した場合、編集者またはIDE(phpstormなど)の「グローバル検索」関数(phpstormなど)の助けを借りて、定義された位置に正確にジャンプするという単語( 'my_constant'」という単語( 'my_constant'」をさらに検索できます。
さらに、Xdebugなどのデバッガーは、ブレークポイントを設定した後、リアルタイムで定数の登録を監視することもできますが、それはより高度な使用法カテゴリに属し、この記事は当面拡張されません。
get_defined_constants()は、「状態比較の前後」の助けを借りて、「誰が定数を定義したか」を直接伝えることはできませんが、定数のソースファイルをすばやく決定できます。この手法は、特に次のように適しています。
神秘的な定数のソースのトラブルシューティング
外部ライブラリによって導入されたグローバル汚染を分析します
自動テストで一定の漏れを監視します
このアイデアを一般的なデバッグツールとしてカプセル化し、同様の問題に遭遇したときにすぐに配置し、半分の努力で結果の2倍を達成できます。