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

is_a関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

is_a関数は、指定されたオブジェクトが特定のクラスまたはその親クラスのインスタンスであるか、あるいは指定されたインターフェースを実装しているかを判定する関数です。

この関数は二つの主要な引数を受け取ります。第一引数には検査したいオブジェクト、またはクラス名を文字列で指定します。第二引数には、比較対象となるクラス名またはインターフェース名を文字列で指定します。オプションの第三引数にtrueを設定することで、第二引数で指定したクラスのオートロードを試みることが可能です。

判定の結果は真偽値(trueまたはfalse)で返されます。is_a関数はinstanceof演算子と似た機能を提供しますが、クラス名を文字列で動的に指定できる点が特徴です。これにより、実行時にオブジェクトの型を柔軟に確認したり、特定のインターフェースを実装しているかを判定したりできます。プログラムの多態性を活用し、堅牢で柔軟なコードを記述する際に有用な関数です。

構文(syntax)

1is_a(new stdClass(), 'stdClass');

引数(parameters)

object|string $object_or_class, string $class, bool $allow_string = false

  • object|string $object_or_class: クラスをチェックしたいオブジェクト、またはクラス名(文字列)
  • string $class: 判定対象のクラス名(文字列)
  • bool $allow_string = false: trueを指定すると、$object_or_class が文字列の場合でも、その文字列が有効なクラス名であれば true を返します。デフォルトは false です。

戻り値(return)

bool

指定された変数やオブジェクトが、指定されたクラスのインスタンスであるか、またはそのクラスを継承している場合に true を返します。それ以外の場合は false を返します。

サンプルコード

PHP is_a() でオブジェクトの型をチェックする

1<?php
2
3// 親クラスを定義します。
4class Vehicle
5{
6    // クラスの存在を示すための簡単なメソッドです。
7    public function move(): string
8    {
9        return "The vehicle moves.";
10    }
11}
12
13// Vehicleクラスを継承する子クラスを定義します。
14class Car extends Vehicle
15{
16    public function honk(): string
17    {
18        return "Car honks!";
19    }
20}
21
22// インターフェースを定義します。
23interface Drivable
24{
25    public function start(): string;
26}
27
28// Drivableインターフェースを実装するクラスを定義します。
29class Truck implements Drivable
30{
31    public function start(): string
32    {
33        return "Truck engine starts.";
34    }
35}
36
37// 様々な型の変数を準備します。
38$myCar = new Car();
39$myTruck = new Truck();
40$myVehicle = new Vehicle();
41$someString = "Hello PHP";
42$someArray = [1, 2, 3]; // キーワード'is_array'に関連付けるための配列
43
44// is_a() 関数を使ったオブジェクトの型チェックの例
45// オブジェクトが特定のクラスのインスタンスであるかチェックします。
46echo "Is \$myCar an instance of Car? " . (is_a($myCar, 'Car') ? 'Yes' : 'No') . PHP_EOL;
47
48// オブジェクトが親クラスのインスタンスであるかチェックします(継承関係があるため true)。
49echo "Is \$myCar an instance of Vehicle (parent class)? " . (is_a($myCar, 'Vehicle') ? 'Yes' : 'No') . PHP_EOL;
50
51// オブジェクトが特定のインターフェースを実装しているかチェックします。
52echo "Is \$myTruck an instance of Drivable (interface)? " . (is_a($myTruck, 'Drivable') ? 'Yes' : 'No') . PHP_EOL;
53
54// オブジェクトが異なるクラスのインスタンスであるかチェックします。
55echo "Is \$myVehicle an instance of Car? " . (is_a($myVehicle, 'Car') ? 'Yes' : 'No') . PHP_EOL;
56
57// is_a() 関数の第3引数 ($allow_string = true) を使ったクラス名の階層チェックの例
58// クラス名文字列が別のクラスの子孫であるかチェックします。
59echo "Is 'Car' a descendant of 'Vehicle'? " . (is_a('Car', 'Vehicle', true) ? 'Yes' : 'No') . PHP_EOL;
60
61// クラス名文字列がインターフェースを実装しているかチェックします。
62echo "Is 'Truck' a descendant of 'Drivable'? " . (is_a('Truck', 'Drivable', true) ? 'Yes' : 'No') . PHP_EOL;
63
64// is_a() 関数と is_array() 関数の違い
65// is_a() はオブジェクトやクラスの階層チェックに使用され、配列のチェックには適していません。
66echo "Is \$someArray an instance of 'array' using is_a()? " . (is_a($someArray, 'array') ? 'Yes' : 'No') . PHP_EOL; // 結果は 'No'
67
68// 配列のチェックには is_array() 関数を使用するのが適切です。
69echo "Is \$someArray an array using is_array()? " . (is_array($someArray) ? 'Yes' : 'No') . PHP_EOL; // 結果は 'Yes'
70
71// is_a() は文字列のようなプリミティブ型の直接的なチェックには使用しません。
72echo "Is \$someString an instance of 'string' using is_a()? " . (is_a($someString, 'string') ? 'Yes' : 'No') . PHP_EOL; // 結果は 'No'
73
74// 文字列のチェックには is_string() 関数を使用するのが適切です。
75echo "Is \$someString a string using is_string()? " . (is_string($someString) ? 'Yes' : 'No') . PHP_EOL; // 結果は 'Yes'
76

PHPのis_a関数は、指定したオブジェクトが特定のクラスのインスタンスであるか、または特定のインターフェースを実装しているかをチェックするために使用します。この関数は、チェック結果を真偽値(trueまたはfalse)で返します。

第1引数にはチェックしたい「オブジェクト」または「クラス名を表す文字列」を、第2引数には比較対象となる「クラス名またはインターフェース名を表す文字列」を指定します。例えば、is_a($myCar, 'Car')と記述すると、$myCarがCarクラスのインスタンスであればtrueが返されます。

is_a関数は、継承関係やインターフェースの実装も考慮します。親クラスであるVehicleを継承したCarクラスのインスタンスである$myCarに対してis_a($myCar, 'Vehicle')とすると、trueを返します。インターフェースについても同様で、Drivableインターフェースを実装したTruckクラスのインスタンス$myTruckに対してis_a($myTruck, 'Drivable')とするとtrueとなります。

第3引数$allow_stringtrueに設定すると、第1引数に「クラス名を表す文字列」を指定して、そのクラスが第2引数で指定されたクラスやインターフェースの子孫であるかをチェックできます。

ただし、is_a関数はオブジェクトやクラスの階層チェックに特化しており、配列や文字列といったプリミティブ型の変数の型チェックには適していません。配列の型をチェックしたい場合はis_array()関数を、文字列の場合はis_string()関数を使用するのが適切です。

PHPのis_a関数は、指定した変数が特定のクラスのインスタンスであるか、あるいは特定のインターフェースを実装しているかをチェックするために利用します。継承関係も考慮され、子クラスのインスタンスは親クラスのインスタンスであると判定されます。第3引数をtrueにすると、オブジェクトではなくクラス名文字列自体が別のクラスの子孫であるか、インターフェースを実装しているかを比較できます。

特に重要な注意点は、is_a関数が配列や文字列のようなプリミティブ型のチェックには適さないことです。例えばis_a($someArray, 'array')falseを返します。配列のチェックにはis_array()、文字列のチェックにはis_string()といった、各型専用の関数を適切に使い分けてください。これにより、意図しない誤動作を防ぎ、コードの信頼性を向上させることができます。

PHP is_a 関数でクラス継承を判定する

1<?php
2
3// 親クラスを定義します
4class Animal
5{
6    public function speak(): string
7    {
8        return "Generic animal sound.";
9    }
10}
11
12// Animalを継承する子クラスを定義します
13class Dog extends Animal
14{
15    public function speak(): string
16    {
17        return "Woof!";
18    }
19}
20
21// Animalを継承しない別のクラスを定義します
22class Cat
23{
24    public function speak(): string
25    {
26        return "Meow!";
27    }
28}
29
30/**
31 * is_a関数の使い方をオブジェクトインスタンスで示す関数
32 *
33 * @param object|null $instance  チェックするオブジェクトインスタンス
34 * @param string      $className 比較対象のクラス名
35 * @return void
36 */
37function demonstrateIsAWithObject(?object $instance, string $className): void
38{
39    echo "--- is_a(\$instance, '{$className}') のテスト ---\n";
40
41    // is_a関数の第一引数にはオブジェクトか文字列が必要です。
42    // nullを直接渡すとTypeErrorが発生するため、事前にチェックします。
43    if ($instance === null) {
44        echo "  インスタンスはnullです。is_a関数はオブジェクトを期待します。\n";
45        echo "  結果: false (is_aは呼び出されません)\n";
46        return;
47    }
48
49    // オブジェクトが特定のクラスのインスタンスであるか、またはその子孫であるかをチェックします。
50    // instanceof 演算子と同様の働きをしますが、is_aはクラス名を文字列で指定できます。
51    if (is_a($instance, $className)) {
52        echo "  " . get_class($instance) . " は '{$className}' のインスタンス、またはその子孫です。\n";
53        echo "  結果: true\n";
54    } else {
55        echo "  " . get_class($instance) . " は '{$className}' のインスタンス、またはその子孫ではありません。\n";
56        echo "  結果: false\n";
57    }
58}
59
60/**
61 * is_a関数の使い方をクラス名文字列で示す関数
62 *
63 * @param string $objectOrClassName チェックするクラス名文字列
64 * @param string $className         比較対象のクラス名
65 * @return void
66 */
67function demonstrateIsAWithString(string $objectOrClassName, string $className): void
68{
69    echo "--- is_a('{$objectOrClassName}', '{$className}', true) のテスト ---\n";
70
71    // 第3引数に true を設定することで、第一引数にクラス名文字列を渡して比較できます。
72    // '{$objectOrClassName}' が '{$className}' の子孫であるか、または同じクラスであるかをチェックします。
73    if (is_a($objectOrClassName, $className, true)) {
74        echo "  '{$objectOrClassName}' は '{$className}' の子孫、または同じクラスです。\n";
75        echo "  結果: true\n";
76    } else {
77        echo "  '{$objectOrClassName}' は '{$className}' の子孫、または同じクラスではありません。\n";
78        echo "  結果: false\n";
79    }
80}
81
82// ----------------------------------------------------
83// is_a 関数の使用例の実行
84// ----------------------------------------------------
85
86// オブジェクトインスタンスを作成
87$dog = new Dog();
88$animal = new Animal();
89$cat = new Cat();
90$nullValue = null; // null値
91
92echo "========== オブジェクトインスタンスでの is_a 使用例 ==========\n";
93
94// Dogオブジェクトとクラス名の比較
95demonstrateIsAWithObject($dog, 'Dog');
96demonstrateIsAWithObject($dog, 'Animal'); // DogはAnimalを継承しているためtrue
97demonstrateIsAWithObject($dog, 'Cat');
98
99echo "\n";
100
101// Animalオブジェクトとクラス名の比較
102demonstrateIsAWithObject($animal, 'Animal');
103demonstrateIsAWithObject($animal, 'Dog'); // AnimalはDogではないためfalse
104
105echo "\n";
106
107// Catオブジェクトとクラス名の比較
108demonstrateIsAWithObject($cat, 'Cat');
109demonstrateIsAWithObject($cat, 'Animal'); // CatはAnimalを継承していないためfalse
110
111echo "\n";
112
113// null値を渡した場合の例(is_aは呼び出されず、nullチェックで処理されます)
114demonstrateIsAWithObject($nullValue, 'Animal');
115
116echo "\n========== クラス名文字列での is_a 使用例 (allow_string = true) ==========\n";
117
118// クラス名文字列とクラス名の比較
119demonstrateIsAWithString('Dog', 'Dog');
120demonstrateIsAWithString('Dog', 'Animal'); // 'Dog'クラスは'Animal'クラスの子孫であるためtrue
121demonstrateIsAWithString('Dog', 'Cat');
122
123echo "\n";
124
125demonstrateIsAWithString('Animal', 'Animal');
126demonstrateIsAWithString('Animal', 'Dog'); // 'Animal'クラスは'Dog'クラスの子孫ではないためfalse
127
128echo "\n";
129
130demonstrateIsAWithString('Cat', 'Cat');
131demonstrateIsAWithString('Cat', 'Animal'); // 'Cat'クラスは'Animal'クラスの子孫ではないためfalse
132

PHPのis_a関数は、特定のオブジェクトがあるクラスのインスタンスであるか、またはその子孫であるかを判定するために使用します。この関数は、instanceof演算子と似ていますが、比較対象のクラス名を文字列で指定できる点が特徴です。

引数は三つあります。一つ目の$object_or_classには、チェックしたいオブジェクトインスタンス、またはクラス名を表す文字列を渡します。二つ目の$classには、比較対象となるクラス名を文字列で指定します。三つ目の$allow_stringはオプションで、デフォルトはfalseです。これをtrueにすると、一つ目の引数にオブジェクトではなくクラス名を表す文字列を渡して比較できるようになります。戻り値は真偽値(bool)で、条件に合致すればtrueを、そうでなければfalseを返します。

サンプルコードでは、Animalクラス、それを継承するDogクラス、そして独立したCatクラスを定義しています。demonstrateIsAWithObject関数では、is_aの第一引数に実際のオブジェクトインスタンスを渡して、そのオブジェクトが指定されたクラスのインスタンスか、またはその子孫であるかをチェックします。例えば、DogオブジェクトはAnimalを継承しているので、is_a($dog, 'Animal')trueとなります。nullを直接is_a関数に渡すとエラーになるため、事前にチェックする処理も含まれています。

一方、demonstrateIsAWithString関数では、is_aの第三引数をtrueに設定し、第一引数に'Dog'のようなクラス名文字列を渡して比較しています。これにより、クラス名文字列同士で継承関係を判定することが可能です。例えば、'Dog'クラスは'Animal'クラスの子孫であるため、is_a('Dog', 'Animal', true)trueを返します。このようにis_a関数を使うことで、オブジェクトやクラス間の継承関係を柔軟に確認することができます。

PHPのis_a関数は、オブジェクトが特定のクラスのインスタンスか、その子孫かを判定します。第一引数にオブジェクトを渡す際、nullを直接指定するとTypeErrorが発生するため、事前にnullチェックが必要です。第二引数には比較対象のクラス名を文字列で渡します。第一引数にクラス名文字列を渡し、その継承関係をチェックしたい場合は、必ず第三引数にtrueを指定してください。これを忘れると正しく判定されません。is_ainstanceof演算子に似ていますが、クラス名を文字列で指定できる点が特徴です。動的にクラスを判定したい場合に特に役立ちます。

PHP is_a() でオブジェクトとクラスの関連性を調べる

1<?php
2
3/**
4 * 商品情報を扱うクラスを定義します。
5 */
6class Product
7{
8    public string $name;
9    public float $price;
10    public array $details; // 商品の詳細情報を連想配列で保持するプロパティ
11
12    /**
13     * Product クラスのコンストラクタ。
14     *
15     * @param string $name 商品名
16     * @param float $price 価格
17     * @param array $details 連想配列形式の商品詳細
18     */
19    public function __construct(string $name, float $price, array $details)
20    {
21        $this->name = $name;
22        $this->price = $price;
23        $this->details = $details;
24    }
25
26    /**
27     * 商品の詳細情報を取得します。
28     *
29     * @return array 連想配列形式の商品詳細
30     */
31    public function getDetails(): array
32    {
33        return $this->details;
34    }
35}
36
37/**
38 * Product クラスを継承するデジタル商品クラスを定義します。
39 */
40class DigitalProduct extends Product
41{
42    public string $licenseKey;
43
44    /**
45     * DigitalProduct クラスのコンストラクタ。
46     *
47     * @param string $name 商品名
48     * @param float $price 価格
49     * @param array $details 連想配列形式の商品詳細
50     * @param string $licenseKey ライセンスキー
51     */
52    public function __construct(string $name, float $price, array $details, string $licenseKey)
53    {
54        parent::__construct($name, $price, $details);
55        $this->licenseKey = $licenseKey;
56    }
57}
58
59// サンプルオブジェクトの作成
60$physicalProduct = new Product(
61    '高性能マウス',
62    49.99,
63    [
64        'manufacturer' => 'XYZ Tech',
65        'weight_g' => 120,
66        'color' => 'Black'
67    ]
68);
69
70$digitalDownload = new DigitalProduct(
71    'eBook: PHP入門',
72    29.99,
73    [
74        'format' => 'PDF',
75        'pages' => 300
76    ],
77    'PHP-GUIDE-12345'
78);
79
80echo "--- is_a() 関数の使用例 ---" . PHP_EOL;
81
82// 1. オブジェクトが特定のクラスのインスタンスであるかをチェック
83// $physicalProduct は Product クラスのインスタンスです
84if (is_a($physicalProduct, 'Product')) {
85    echo "1. \$physicalProduct は 'Product' クラスのインスタンスです。" . PHP_EOL;
86}
87
88// 2. 継承関係もチェックされます
89// $digitalDownload は DigitalProduct クラスのインスタンスですが、Product クラスも継承しています
90if (is_a($digitalDownload, 'Product')) {
91    echo "2. \$digitalDownload は 'Product' クラスを継承しているため、'Product' のインスタンスと見なされます。" . PHP_EOL;
92}
93
94// 3. 自身のクラスであるかをチェック
95if (is_a($digitalDownload, 'DigitalProduct')) {
96    echo "3. \$digitalDownload は 'DigitalProduct' クラスのインスタンスです。" . PHP_EOL;
97}
98
99// 4. 存在しないクラス名を指定した場合 (false が返る)
100if (!is_a($physicalProduct, 'NonExistentClass')) {
101    echo "4. \$physicalProduct は 'NonExistentClass' クラスのインスタンスではありません。" . PHP_EOL;
102}
103
104echo PHP_EOL . "--- is_a() でクラス名文字列をチェックする例 (\$allow_string = true) ---" . PHP_EOL;
105
106// 5. 第一引数にクラス名を文字列で渡し、$allow_string を true に設定
107// 'Product' という文字列が 'Product' クラスと同一であるかをチェック
108if (is_a('Product', 'Product', true)) {
109    echo "5. 'Product' という文字列は 'Product' クラスを参照します。" . PHP_EOL;
110}
111
112// 6. クラス名文字列が指定されたクラスを継承しているかをチェック
113// 'DigitalProduct' クラスは 'Product' クラスを継承しています
114if (is_a('DigitalProduct', 'Product', true)) {
115    echo "6. 'DigitalProduct' という文字列は 'Product' クラスを継承しているため、'Product' と見なされます。" . PHP_EOL;
116}
117
118echo PHP_EOL . "--- キーワード 'is_array' と '連想配列' の関連付け ---" . PHP_EOL;
119
120// 7. Product クラスのプロパティとして連想配列を扱い、is_array() で確認
121$productDetails = $physicalProduct->getDetails(); // getDetails() は連想配列を返す
122if (is_array($productDetails)) {
123    echo "7. \$physicalProduct の 'details' プロパティ(取得した情報)は連想配列です。" . PHP_EOL;
124    echo "   詳細情報: " . json_encode($productDetails, JSON_UNESCAPED_UNICODE) . PHP_EOL;
125}
126
127// 8. デジタル商品の詳細情報も同様に確認
128$digitalDetails = $digitalDownload->getDetails();
129if (is_array($digitalDetails)) {
130    echo "8. \$digitalDownload の 'details' プロパティ(取得した情報)も連想配列です。" . PHP_EOL;
131    echo "   詳細情報: " . json_encode($digitalDetails, JSON_UNESCAPED_UNICODE) . PHP_EOL;
132}
133

is_a関数は、指定したオブジェクトが特定のクラスのインスタンスであるか、あるいはそのクラスを継承しているかを判定する際に利用されます。第一引数には検証したいオブジェクト、第二引数には比較対象のクラス名を文字列で指定します。もし第三引数$allow_stringtrueにすると、第一引数にオブジェクトではなくクラス名の文字列を渡して、クラス間の継承関係をチェックすることも可能です。この関数は判定結果を真偽値(trueまたはfalse)で返します。

サンプルコードでは、Productクラスとその子クラスであるDigitalProductのインスタンスを用いてis_a関数の挙動を具体的に示しています。例えば、DigitalProductのインスタンスは、自身のクラスだけでなく、継承元であるProductクラスのインスタンスとしても正しく認識されることがわかります。また、$allow_stringtrueに設定した例では、オブジェクトを生成せずにクラス名文字列だけで継承関係を確認できることが示されています。

さらに、サンプルコードではPHPのis_array関数も登場します。この関数は、与えられた変数が配列であるかを判定するもので、特に連想配列のような構造を持つデータが期待通りに扱われているかを確認する際に役立ちます。Productクラスのdetailsプロパティは連想配列として定義されており、is_array関数を使ってそのデータ型が適切であるかを検証しています。これにより、プログラムの安全性を高めることができます。

is_a関数は、指定したオブジェクトが特定のクラスのインスタンスであるか、またはそのクラスを継承しているかを判定します。親クラスを指定した場合でも、子クラスのインスタンスはtrueと評価される点が重要です。また、第三引数$allow_stringtrueにすると、第一引数にオブジェクトではなくクラス名を示す文字列を渡して、クラス間の継承関係をチェックできます。一方、is_array関数は、数値添字配列と連想配列の両方を区別なく「配列」として認識し、trueを返します。PHPでは連想配列も通常の配列の一種として扱われるため、連想配列だけを特別に判定する機能ではないことに注意してください。

関連コンテンツ