【PHP8.x】get_declared_classes関数の使い方

作成日: 更新日:

get_declared_classes関数は、現在PHPスクリプトの実行環境において宣言されている、すべてのクラスの名前を取得する関数です。この関数を呼び出すと、ユーザーが独自に定義したクラスや、PHPが内部的に提供する組み込みクラスなど、利用可能なクラスのリストが取得できます。戻り値は、宣言されている各クラス名を要素として含む、文字列の配列となります。

この機能は、アプリケーション内で現在利用できるクラスを動的に把握したい場合に非常に有用です。例えば、デバッグ目的で読み込まれているクラスの一覧を表示したり、リフレクション機能と組み合わせて特定のクラスに関する詳細な情報を取得する前段階として利用したりすることができます。また、大規模なシステムやフレームワークにおいて、特定の条件下で特定のクラスが既に定義されているかを確認するといった場面でも活用されます。

引数を一切取らずに呼び出すことができ、その時点でのPHPの実行環境に存在するすべてのクラスの情報をシンプルに提供します。オートロード機能によって遅延読み込みされたクラスも、実際にメモリ上に宣言された後であれば、このリストに含まれることになります。このように、get_declared_classes関数は、PHPアプリケーションの動的なクラス管理や情報収集において重要な役割を果たします。

基本的な使い方

構文(syntax)

<?php

$declaredClasses = get_declared_classes();
print_r($declaredClasses);

?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

array

定義済みのすべてのクラスの配列を返します。

サンプルコード

PHPの定義済みクラス一覧を取得する

<?php

/**
 * サンプルクラスA
 */
class MyClassA
{
    public function __construct()
    {
        // コンストラクタ
    }
}

/**
 * サンプルクラスB
 */
class MyClassB
{
    public static function someStaticMethod(): void
    {
        // 静的メソッド
    }
}

// get_declared_classes() は、スクリプト実行中に定義されている全てのクラス名を配列で返します。
// これには、ユーザー定義クラスだけでなく、PHP の内部クラスも含まれます。
$declaredClasses = get_declared_classes();

echo "現在定義されているクラス一覧:\n";
echo "---------------------------------\n";

// 見やすくするために、定義したばかりのユーザー定義クラスに絞って表示することもできますが、
// ここでは関数が返す全てのクラスを表示します。
foreach ($declaredClasses as $className) {
    echo $className . "\n";
}

echo "---------------------------------\n";
echo "上記リストには、ユーザー定義クラス (MyClassA, MyClassB など) と、\n";
echo "PHP が提供する内部クラス (StdClass, Exception など) の両方が含まれます。\n";

?>

PHP 8.4のget_declared_classes関数は、現在スクリプトの実行中にPHP環境内で利用可能なすべてのクラスの名前を、文字列の配列として取得する際に使用します。この関数は引数を一切受け付けず、戻り値として宣言済みのクラス名が格納された配列(array)を返します。

サンプルコードでは、MyClassAMyClassBという2つのカスタムクラスを事前に定義しています。その後、get_declared_classes()関数を呼び出すことで、これらのユーザー定義クラスに加え、StdClassExceptionといったPHPが内部的に提供する様々な組み込みクラスの名前もすべて網羅した配列が$declaredClasses変数に格納されます。この配列をループ処理で表示することにより、PHP環境が認識しているクラスの一覧を動的に確認できます。これにより、スクリプト実行時にどのようなクラスが存在しているかを把握し、プログラムの振る舞いを理解するのに役立ちます。

get_declared_classes()関数は、スクリプト実行中に呼び出された時点ですでに定義されている全てのクラス名を文字列の配列として返します。これには、ご自身で作成したユーザー定義クラスだけでなく、PHPが標準で提供するstdClassExceptionのような内部クラスも含まれる点に注意が必要です。戻り値は常に配列型ですので、foreachなどを使って安全に処理できます。主にデバッグ時や、特定のクラスが存在するかどうかの確認、あるいはフレームワークで動的にクラス情報を扱う際に役立ちます。大規模なアプリケーションでは多くのクラスがリストアップされる可能性があるため、その点を考慮して利用してください。

PHPで宣言されているクラス一覧を取得する

<?php

/**
 * サンプルクラスAを定義します。
 */
class SampleClassA
{
    public function __construct()
    {
        // コンストラクタ
    }
}

/**
 * サンプルクラスBを定義します。
 */
class SampleClassB
{
    public static function staticMethod()
    {
        return "Static method called.";
    }
}

/**
 * PHPスクリプト内で宣言されているすべてのクラス名を取得し、表示します。
 * get_declared_classes() は、スクリプト実行時までに定義されているクラス(
 * PHP組み込みクラス、ユーザー定義クラス、ロードされたライブラリのクラスなど)
 * の名前を配列として返します。
 */
function displayDeclaredClasses(): void
{
    echo "--- 宣言されているクラス一覧 ---\n";

    // 宣言されているクラスの配列を取得
    $declaredClasses = get_declared_classes();

    // クラス名をアルファベット順にソートすると見やすくなります
    sort($declaredClasses);

    foreach ($declaredClasses as $className) {
        echo "- " . $className . "\n";
    }

    echo "--- 表示終了 ---\n";
}

// 関数を実行して、宣言されているクラスを表示
displayDeclaredClasses();

?>

PHPのget_declared_classes関数は、PHPスクリプトが実行された時点で、現在までに宣言されているすべてのクラスの名前を取得するための内部関数です。この関数は引数をとりません。戻り値は配列(array)であり、その配列には宣言されているクラス名が文字列として格納されます。

取得されるクラス名には、サンプルコードで定義されているSampleClassASampleClassBのようなユーザー定義クラスに加え、PHPが標準で提供する組み込みクラスや、スクリプト内でロードされたライブラリのクラスも含まれます。

サンプルコードでは、SampleClassASampleClassBという2つのユーザー定義クラスを宣言した後、displayDeclaredClasses関数内でget_declared_classes()を呼び出しています。この呼び出しにより、それまでに宣言されたすべてのクラス名が配列として取得されます。取得したクラス名の配列はアルファベット順にソートされ、その後foreachループを使って各クラス名が画面に出力されます。この関数は、実行中のPHP環境でどのようなクラスが利用可能であるかを動的に確認したり、特定のクラスの存在を検証したりするデバッグなどの場面で役立ちます。

get_declared_classes()関数は、その呼び出し時点までにPHPが認識しているすべてのクラス名を文字列の配列として返します。重要な注意点として、この関数を呼び出した時点でまだオートロードされていないクラスは、リストに含まれないことがあります。これは、PHPがクラスを実際に必要とするまでロードを遅延させる仕組みによるものです。したがって、期待するクラスが見つからない場合は、そのクラスがまだロードされていない可能性を考慮してください。この関数は、主にデバッグや、リフレクションAPIと組み合わせて動的にクラス情報を検査する際に役立ちます。返されるクラス名は完全修飾名であり、取得後にsort()関数などでソートすると、一覧性が高まり分析しやすくなります。

PHPのネームスペース内クラスを検索する

<?php

namespace App\Models {
    class User
    {
        public function __construct()
        {
            // Constructor logic
        }
    }

    class Product
    {
        public function __construct()
        {
            // Constructor logic
        }
    }
}

namespace App\Services {
    class AuthService
    {
        public function __construct()
        {
            // Constructor logic
        }
    }
}

namespace App\Utils {
    class Helper
    {
        public function __construct()
        {
            // Constructor logic
        }
    }
}

// Global scope class
class GlobalClass
{
    public function __construct()
    {
        // Constructor logic
    }
}

/**
 * 特定のネームスペースに属する宣言済みクラスを検索し、表示する関数です。
 *
 * @param string $namespaceName 検索対象のネームスペース名 (例: 'App\Models')
 * @return void
 */
function findClassesInNamespace(string $namespaceName): void
{
    // 全ての宣言済みクラスを取得
    $allDeclaredClasses = get_declared_classes();
    $foundClasses = [];

    echo "=== ネームスペース '{$namespaceName}' 内のクラス検索 ===\n";

    foreach ($allDeclaredClasses as $className) {
        // クラス名が指定されたネームスペースで始まるかチェック
        // ネームスペース名の後にバックスラッシュがあることを確認することで、
        // 'App\Model' と 'App\Models' のような誤判定を防ぐ
        if (str_starts_with($className, $namespaceName . '\\')) {
            $foundClasses[] = $className;
        }
    }

    if (empty($foundClasses)) {
        echo "指定されたネームスペース内でクラスは見つかりませんでした。\n";
    } else {
        echo "見つかったクラス:\n";
        foreach ($foundClasses as $class) {
            echo "- {$class}\n";
        }
    }
    echo "\n";
}

// 例として、異なるネームスペースで関数を実行
findClassesInNamespace('App\Models');
findClassesInNamespace('App\Services');
findClassesInNamespace('App\Utils');
findClassesInNamespace('NonExistent\Namespace');

?>

PHPのget_declared_classes関数は、現在スクリプトが読み込んで認識している全てのクラス名を、文字列の配列として取得する組み込み関数です。この関数は引数を一切必要とせず、宣言されているクラス名のリストを返します。

提供されたサンプルコードは、このget_declared_classes関数を使って、特定のネームスペースに属するクラスだけを抽出する方法を示しています。コードでは、App\ModelsApp\Servicesといった異なるネームスペース内に複数のクラスが定義されています。findClassesInNamespaceという関数は、まずget_declared_classes()を呼び出し、これら全ての宣言済みクラスの名前を一覧として取得します。その後、取得したクラス名のリストを一つずつ確認し、引数で渡されたネームスペース名でクラス名が始まるかどうかをstr_starts_with関数で判定します。この際、ネームスペース名の後にバックスラッシュを加えることで、例えば「App\Model」と「App\Models」のように似た名前のネームスペースを正確に区別し、目的のネームスペースに属するクラスだけを確実に特定しています。最終的に、指定されたネームスペース内で見つかったクラス名が表示され、アプリケーション内のクラス管理に役立てることができます。

get_declared_classes関数は、PHPが実行時までに認識している全てのクラス名(PHP内部クラスや既に読み込まれたライブラリのクラスも含む)を返します。そのため、特定のネームスペース内のクラスのみを抽出するには、サンプルコードのようにクラス名が指定のネームスペースで始まるかをstr_starts_withなどで確認する処理が必須です。この際、ネームスペース名の後にバックスラッシュ(\)を追加することで、より正確なフィルタリングが可能になり、部分一致による誤判定を防げます。また、この関数はプログラム実行中に定義されたクラスのみを対象とし、まだオートロードされていないクラスは含まれない点を考慮して利用してください。

【PHP8.x】get_declared_classes関数の使い方 | いっしー@Webエンジニア