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

作成日: 更新日:

get_parent_class関数は、指定されたクラスまたはオブジェクトの直接の親クラスの名前を取得する関数です。PHPにおけるオブジェクト指向プログラミングでは、クラスが別のクラスの性質や機能を継承(引き継ぎ)することで、コードの再利用性や拡張性を高めることができます。この関数は、そうしたクラス間の継承関係をプログラムで確認したい場合に特に有用です。

この関数は、引数としてクラス名を表す文字列、またはクラスのインスタンスであるオブジェクトを受け取ります。例えば、あるクラスが「BaseClass」を継承して作られた「ChildClass」である場合、get_parent_class('ChildClass')と呼び出すと、「BaseClass」という文字列が返されます。

もし指定されたクラスやオブジェクトが親クラスを持たない場合、例えば、PHPの標準クラスやユーザー定義の最も基本的なクラスの場合、この関数はブール値のfalseを返します。同様に、存在しないクラス名や無効な引数が渡された場合もfalseが返され、同時に警告メッセージが出力されることがあります。これにより、プログラムの実行中にクラスの階層構造を動的に調べたり、特定のクラスが特定の親クラスを持つかどうかを検証したりするのに役立ちます。

基本的な使い方

構文(syntax)

<?php

class MyBaseClass {}

class MyDerivedClass extends MyBaseClass {}

// オブジェクトの親クラス名を取得
$instance = new MyDerivedClass();
$parentClassName = get_parent_class($instance);

echo $parentClassName; // 出力例: MyBaseClass

// クラス名の文字列から親クラス名を取得
// $parentClassNameFromString = get_parent_class('MyDerivedClass');
// echo $parentClassNameFromString; // 出力例: MyBaseClass

?>

引数(parameters)

object|string $object_or_class = null

  • object|string $object_or_class = null: クラス名またはオブジェクトを指定します。指定しない場合は、現在のスコープにあるクラスを対象とします。

戻り値(return)

string|false

指定されたクラスの親クラスの名前を文字列で返します。親クラスが存在しない場合は false を返します。

サンプルコード

PHP get_parent_class で親クラス名を取得する

<?php

/**
 * このファイルは、`get_parent_class` 関数を使って、
 * クラスの親クラス名を取得する方法を示すサンプルコードです。
 *
 * `get_parent_class` 関数は、オブジェクトまたはクラス名の文字列を引数に取り、
 * そのクラスの親クラスの名前を文字列で返します。
 * 親クラスが存在しない場合は `false` を返します。
 */

// 親クラスを定義します
class MyBaseClass
{
    // ...
}

// MyBaseClass を継承する子クラスを定義します
class MyDerivedClass extends MyBaseClass
{
    // ...
}

// どのクラスも継承しない独立したクラスを定義します
class MyStandaloneClass
{
    // ...
}

// 例1: オブジェクトから親クラス名を取得する
$derivedObject = new MyDerivedClass();
$parentOfObject = get_parent_class($derivedObject);

if ($parentOfObject !== false) {
    echo "オブジェクト '" . get_class($derivedObject) . "' の親クラス: " . $parentOfObject . PHP_EOL;
} else {
    echo "オブジェクト '" . get_class($derivedObject) . "' に親クラスはありません。" . PHP_EOL;
}

echo PHP_EOL; // 出力を区切るための改行

// 例2: クラス名の文字列から親クラス名を取得する
$parentOfClassName = get_parent_class('MyDerivedClass');

if ($parentOfClassName !== false) {
    echo "クラス名 'MyDerivedClass' の親クラス: " . $parentOfClassName . PHP_EOL;
} else {
    echo "クラス名 'MyDerivedClass' に親クラスはありません。" . PHP_EOL;
}

echo PHP_EOL; // 出力を区切るための改行

// 例3: 親クラスを持たないクラスの場合 (`false` が返される)
$parentOfStandalone = get_parent_class('MyStandaloneClass');

if ($parentOfStandalone === false) {
    echo "クラス名 'MyStandaloneClass' の親クラス: false (親クラスが存在しないため)" . PHP_EOL;
} else {
    echo "クラス名 'MyStandaloneClass' の親クラス: " . $parentOfStandalone . PHP_EOL;
}

echo PHP_EOL; // 出力を区切るための改行

// 例4: 存在しないクラス名を指定した場合 (`false` が返される)
$parentOfNonExistent = get_parent_class('NonExistentClass');

if ($parentOfNonExistent === false) {
    echo "クラス名 'NonExistentClass' の親クラス: false (クラスが存在しないため)" . PHP_EOL;
} else {
    echo "クラス名 'NonExistentClass' の親クラス: " . $parentOfNonExistent . PHP_EOL;
}

?>

PHPのget_parent_class関数は、指定したクラスの直近の親クラス名を取得するために利用されます。この関数には、クラスのインスタンス(オブジェクト)またはクラス名の文字列を引数として渡すことができます。

関数が正常に親クラス名を特定できた場合、その親クラスの名前を文字列として返します。しかし、指定されたクラスに親クラスが存在しない場合、あるいは引数として渡されたクラス名自体が存在しない場合はfalseを返します。

サンプルコードでは、MyBaseClassを継承するMyDerivedClassを例に、オブジェクトから、またはクラス名の文字列から親クラス名を取得する様子が示されています。また、MyStandaloneClassのようにどのクラスも継承していないクラスに対してこの関数を呼び出すとfalseが返されること、さらに存在しないクラス名を指定した場合もfalseが返されることが確認できます。これにより、この関数が様々な状況でどのように振る舞うかを具体的に理解することができます。

get_parent_class関数は、オブジェクトまたはクラス名の文字列から、そのクラスが継承している親クラスの名前を文字列で取得します。最も重要な注意点として、親クラスが存在しない場合や、指定されたクラス名が定義されていない場合は、この関数はfalseを返します。したがって、関数が返す値がfalseでないかを常に確認する条件分岐を適切に記述し、取得した親クラス名を安全に利用するようにしてください。これにより、予期せぬエラーを防ぎ、堅牢なプログラムを作成することができます。

PHPで親クラス名とプロパティを取得する

<?php

/**
 * 親クラスを定義します。
 * プロパティやコンストラクタを持ちます。
 */
class Vehicle
{
    public string $color;

    public function __construct(string $color)
    {
        $this->color = $color;
    }
}

/**
 * 子クラスを定義します。
 * Vehicle クラスを継承し、親のプロパティを引き継ぎます。
 */
class Car extends Vehicle
{
    public string $make;

    public function __construct(string $color, string $make)
    {
        // 親クラスのコンストラクタを呼び出し、親のプロパティを初期化します。
        parent::__construct($color);
        $this->make = $make;
    }
}

/**
 * get_parent_class 関数の使用例と、親クラスのプロパティへのアクセスをデモンストレーションします。
 */
function demonstrateGetParentClassAndProperties(): void
{
    // Car クラスのインスタンスを作成します。
    $myCar = new Car('Red', 'Toyota');

    // 1. オブジェクトを引数として親クラス名を取得します。
    // get_parent_class は、指定されたオブジェクトの親クラス名を文字列で返します。
    // 親クラスがない場合は false を返します。
    $parentClassByObject = get_parent_class($myCar);
    echo "オブジェクト (\$myCar) の親クラス: " . ($parentClassByObject ?: '親クラスなし') . "\n";

    // 2. クラス名を文字列として引数に親クラス名を取得します。
    // クラス名が指定された場合も同様に親クラス名を返します。
    $parentClassByString = get_parent_class('Car');
    echo "クラス名 ('Car') の親クラス: " . ($parentClassByString ?: '親クラスなし') . "\n";

    // 3. 継承された親クラスのプロパティにアクセスします。
    // Car クラスは Vehicle クラスを継承しているため、Vehicle の $color プロパティを持っています。
    echo "私の車の色 (親クラス Vehicle から継承): " . $myCar->color . "\n";
}

// デモンストレーション関数を実行します。
demonstrateGetParentClassAndProperties();

PHPのget_parent_class関数は、オブジェクト指向プログラミングにおけるクラスの継承関係を調べる際に利用される便利な機能です。この関数は、引数として指定されたオブジェクトのインスタンス、またはクラス名を文字列で受け取ります。そして、もし親クラスが存在すればそのクラス名を文字列で返し、親クラスが存在しない(つまり、それが最上位のクラスである)場合はfalseを返します。

サンプルコードでは、基本的なクラス継承の例としてVehicleクラスを親とし、Carクラスをその子として定義しています。CarクラスはVehicleクラスの$colorプロパティを継承し、自身のコンストラクタ内でparent::__constructを使って親のプロパティを適切に初期化しています。

demonstrateGetParentClassAndProperties関数内では、Carクラスのインスタンスを作成した後、get_parent_class関数を二通りの方法で呼び出す様子を示しています。一つは作成した$myCarオブジェクトを直接渡す方法、もう一つはクラス名'Car'を文字列として渡す方法です。どちらの呼び出しでも、親クラス名である'Vehicle'が正確に取得できることを確認できます。

さらに、このサンプルコードでは、子クラスのインスタンス$myCarから、親クラスVehicleから継承された$colorプロパティに直接アクセスできることを示しています。これにより、get_parent_class関数がクラス階層の動的な確認に役立つだけでなく、継承によってプロパティがどのように引き継がれ、利用されるのかを具体的に理解できるようになっています。

get_parent_class関数は、指定したオブジェクトやクラス名の直接の親クラス名を文字列で返しますが、親クラスが存在しない場合はfalseが返されます。そのため、戻り値がfalseでないか常に確認し、適切に処理を分岐させてください。

子クラスで親クラスを継承する際、親のプロパティを正しく初期化するためには、子クラスのコンストラクタ内でparent::__construct()を呼び出すことが非常に重要です。これを忘れると、親クラスで定義されたプロパティが初期化されずに意図しない動作を引き起こす可能性があります。継承されたプロパティは、アクセス修飾子に応じて子クラスのインスタンスからアクセス可能です。この関数は、プログラム実行時にクラスの継承関係を動的に調べたい場合に活用できます。

PHP reflectionで親クラス名を取得する

<?php

/**
 * 基本的なクラス階層を定義します。
 * システムエンジニアを目指す初心者がオブジェクト指向の継承を理解するのに役立ちます。
 */
class GrandParentClass
{
    // このクラスは他のクラスを継承していません。
}

class ParentClass extends GrandParentClass
{
    // このクラスは GrandParentClass を継承しています。
}

class ChildClass extends ParentClass
{
    // このクラスは ParentClass を継承しています。
}

/**
 * get_parent_class() 関数の使用方法を示すサンプルコードです。
 *
 * この関数は、指定されたオブジェクトまたはクラス名の親クラスの名前を取得するために使用されます。
 * PHP のクラス階層を理解し、実行時にクラスの関係性を調べる際に役立ちます。
 */
function demonstrateGetParentClassUsage(): void
{
    echo "--- get_parent_class() のデモンストレーション ---" . PHP_EOL;

    // 1. オブジェクトインスタンスから親クラスの名前を取得する例
    $childObject = new ChildClass();
    $parentOfChildObject = get_parent_class($childObject);

    if ($parentOfChildObject !== false) {
        echo "ChildClass のインスタンスの親クラス: " . $parentOfChildObject . PHP_EOL; // 期待される出力: ParentClass
    } else {
        echo "ChildClass のインスタンスには親クラスがありません (またはエラー発生)。" . PHP_EOL;
    }

    echo PHP_EOL; // 出力を見やすくするための改行

    // 2. クラス名文字列から親クラスの名前を取得する例
    $parentOfChildClassString = get_parent_class('ChildClass');

    if ($parentOfChildClassString !== false) {
        echo "クラス名 'ChildClass' の親クラス: " . $parentOfChildClassString . PHP_EOL; // 期待される出力: ParentClass
    } else {
        echo "クラス名 'ChildClass' には親クラスがありません (またはエラー発生)。" . PHP_EOL;
    }

    echo PHP_EOL;

    // 3. 階層の中間にあるクラスの親クラスを取得する例
    $parentOfParentClassString = get_parent_class('ParentClass');

    if ($parentOfParentClassString !== false) {
        echo "クラス名 'ParentClass' の親クラス: " . $parentOfParentClassString . PHP_EOL; // 期待される出力: GrandParentClass
    } else {
        echo "クラス名 'ParentClass' には親クラスがありません (またはエラー発生)。" . PHP_EOL;
    }

    echo PHP_EOL;

    // 4. 最上位のクラス (継承元がないクラス) の親クラスを取得する例
    // この場合、親クラスが存在しないため、get_parent_class() は false を返します。
    $parentOfGrandParentClassString = get_parent_class('GrandParentClass');

    if ($parentOfGrandParentClassString !== false) {
        echo "クラス名 'GrandParentClass' の親クラス: " . $parentOfGrandParentClassString . PHP_EOL;
    } else {
        echo "クラス名 'GrandParentClass' には親クラスがありません (最上位クラス)。" . PHP_EOL; // 期待される出力
    }

    echo PHP_EOL;

    // 5. 存在しないクラス名を渡した場合の例
    // この場合も、get_parent_class() は false を返します。
    $parentOfNonExistentClass = get_parent_class('NonExistentClass');

    if ($parentOfNonExistentClass !== false) {
        echo "存在しないクラス名 'NonExistentClass' の親クラス: " . $parentOfNonExistentClass . PHP_EOL;
    } else {
        echo "存在しないクラス名 'NonExistentClass': 親クラスが見つかりません (クラス自体が存在しない可能性があります)。" . PHP_EOL; // 期待される出力
    }
}

// 上記のデモンストレーション関数を実行します。
demonstrateGetParentClassUsage();

?>

PHPのget_parent_class()関数は、指定したクラスの直接の親クラス(継承元のクラス)の名前を取得するための関数です。オブジェクト指向プログラミングにおけるクラスの継承関係を、プログラムの実行中に動的に調べる際に役立ちます。

この関数の引数には、親クラスを調べたいオブジェクトのインスタンス、またはクラス名を文字列として指定します。関数を実行すると、親クラスが存在する場合にはそのクラス名が文字列として返されます。もし指定したクラスがどのクラスも継承していない最上位のクラスである場合や、そもそも存在しないクラス名を指定した場合には、falseが返されます。

サンプルコードでは、ChildClassParentClassGrandParentClassという3つのクラスで継承関係を定義しています。get_parent_class()ChildClassのオブジェクトやクラス名を渡すと、その親であるParentClassという文字列が取得できます。同様に、ParentClassを調べるとGrandParentClassが返されます。最上位のGrandParentClassには親クラスがないため、falseが返ることを確認できます。

この関数は、親クラスの名前を文字列で返しますが、親クラスがない場合や指定したクラスが存在しない場合にはfalseを返します。そのため、戻り値を利用する際は、サンプルコードのように!== falseを使って必ず厳密な比較を行ってください。falseが返る理由が、親がいないためか、クラス自体が存在しないためかをこの関数だけで区別することはできません。必要であればclass_exists()と組み合わせて確認することが推奨されます。引数にはオブジェクトインスタンスとクラス名文字列のどちらも渡すことができ、動的にクラスの継承関係を調べる際に便利です。

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