PHPで定義された名前空間の一覧を取得する方法
PHPには、読み込まれた名前空間を直接一覧取得するための組み込み関数が存在しません。たとえば、ファイル1に名前空間 ns_1、ファイル2に名前空間 ns_2 が定義されていて、これらがファイル3にインクルードされた場合でも、「ns_1 と ns_2 の名前空間が読み込まれた」ことを直接知る手段はありません。
唯一の方法は、class_exists 関数や get_declared_classes 関数を利用することです。get_declared_classes を使えば宣言済みクラスの一覧を取得できるため、そのクラス名をもとに対応する名前空間を特定することが可能です。
特定の名前空間が存在するか確認する関数
以下のような関数を自作すれば、指定した名前空間がすでに定義されているかどうかを判定できます。
function namespaceExists($namespace) {
$namespace .= "\\";
foreach(get_declared_classes() as $name)
if(strpos($name, $namespace) === 0) return true;
return false;
}この関数は、宣言済みクラス名の先頭が対象の名前空間と一致しているかを strpos でチェックする仕組みです。
定義済み名前空間を階層構造で一覧取得する例
次のコードでは、複数の名前空間(FirstNamespace、SecondNamespace など)を定義し、それぞれに空のクラス new_class を宣言しています。その後、get_declared_classes() で取得したすべてのクラスに対して foreach ループを実行し、正規表現で名前空間部分を抽出して配列として整理します。
<?php
namespace FirstNamespace;
class new_class {}
namespace SecondNamespace;
class new_class {}
namespace ThirdNamespace\FirstSubNamespace;
class new_class {}
namespace ThirdNamespace\SecondSubNamespace;
class new_class {}
namespace SecondNamespace\FirstSubNamespace;
class new_class {}
$namespaces=array();
foreach(get_declared_classes() as $name) {
if(preg_match_all("@[^\\\]+(?=\\\)@iU", $name, $matches)) {
$matches = $matches[0];
$parent =&$namespaces;
while(count($matches)) {
$match = array_shift($matches);
if(!isset($parent[$match]) && count($matches))
$parent[$match] = array();
$parent =&$parent[$match];
}
}
}
print_r($namespaces);出力結果
上記のコードを実行すると、次のような出力が得られます。
Array ( [FirstNamespace] => [SecondNamespace] => Array ( [FirstSubNamespace] => ) [ThirdNamespace] => Array ( [FirstSubNamespace] => [SecondSubNamespace] => ) )
処理の流れ
まず、複数の名前空間(FirstNamespace、SecondNamespace など)を作成し、それぞれに空のクラス new_class を宣言します。続いて、名前空間を格納するための配列を用意し、foreach ループで宣言済みクラスを順番に処理していきます。各クラス名に対して preg_match_all による正規表現マッチを行い、名前空間部分だけを抽出します。その結果として、現在の実行環境で定義されている名前空間が、親子関係を保った階層的な配列として表示される仕組みです。
-
PHPのdefined()関数の使い方:定数の存在確認をわかりやすく解説
PHPのdefined()関数は、指定した定数がすでに定義されているかどうか(存在するかどうか)を確認するための関数です。プログラムの中で定数が設定済みかをチェックし、重複定義エラーを防ぎたい場合などに活用できます。 構文 defined(name) パラメータ name − 存在を確認したい定数の名前。文字列として指定します。 戻り値 defined()関数は、指定した定数が存在する場合は true を返し、存在しない場合は false を返します。 使用例 次の例では、定数が存在するかどうかを確認しています。 <?php define("myC
-
PHPのlist()関数とは?基本構文と使い方を実例つきで解説
PHPのlist()関数は、配列の要素を一括して複数の変数へ代入するための言語構造です。配列のように振る舞う形式で変数に値を割り当てることができ、代入処理が行われた配列をそのまま返します。複数の値を個別の変数に分けたい場面で、コードを簡潔に書けるのが大きな特徴です。 基本構文 list(variable1, variable2, variable3, ...) パラメータ variable1 − 代入先となる最初の変数(必須) variable2 − 2番目以降に代入する変数(省略可能) variable3 − さらに続けて指定できる変数(省略可能) 戻り値 list()関数は、代入が実行