オブジェクト指向プログラミングでは、特に相続レベルが非常に深くなる可能性のある複雑なプロジェクトで、クラス間の相続関係を理解し、習得することが非常に重要です。 PHPは、クラスとオブジェクトの間の相続関係を判断するためのいくつかの有用な機能を提供します。その中には、 IS_A()とIS_SubClass_of()が最も一般的に使用されている2つです。ただし、これら2つの関数の使用シナリオはわずかに異なります。それらを一緒に使用すると、オブジェクトが特定の継承システムの一部に属しているかどうかをより正確に判断できます。
IS_A()は、オブジェクトがクラスのインスタンスであるかどうか、またはそのクラス(直接および間接継承を含む)から継承されるかどうかを判断するために使用されます。また、最初のパラメーターとしてクラスの名前のパッシングをサポートします。
<?php
class A {}
class B extends A {}
class C extends B {}
$obj = new C();
var_dump(is_a($obj, 'A')); // true
?>
is_a()は、オブジェクトの「実際のアイデンティティ」を検出します。つまり、オブジェクトのクラスがターゲットクラスまたはそのサブクラスである限り、trueを返します。
is_subclass_of()は、クラスまたはオブジェクトがクラスのサブクラスであるかどうかを決定しますが、クラス自体が独自のサブクラスであるとは考えていません。
<?php
class A {}
class B extends A {}
class C extends B {}
$obj = new C();
var_dump(is_subclass_of($obj, 'A')); // true
var_dump(is_subclass_of('C', 'A')); // true
var_dump(is_subclass_of('A', 'A')); // false
?>
is_subclass_of()は、オブジェクトの実際のタイプが一致するかどうかよりも、継承された構造に重点を置いています。
実際の開発では、ベースクラス自体を含めるのではなく、クラスまたはオブジェクトが特定の継承システムのサブクラスに厳密に属しているかどうかを判断する必要があります。現時点では、2つの機能を組み合わせて使用して、それぞれ基本クラスと非ヒ時間の状況を除外できます。
誤用を避けるために、次の基本クラスポリシー(ポリシー自体ではない)のサブクラスであることを確認する必要があるポリシーローダーを設計するとします。
<?php
abstract class Policy {
abstract public function apply();
}
class AdminPolicy extends Policy {
public function apply() {
echo "Admin policy applied.";
}
}
class GuestPolicy extends Policy {
public function apply() {
echo "Guest policy applied.";
}
}
function loadPolicy($policyClassName) {
if (!class_exists($policyClassName)) {
throw new InvalidArgumentException("クラスは存在しません");
}
if (!is_subclass_of($policyClassName, 'Policy')) {
throw new InvalidArgumentException("でなければなりません Policy のサブクラス");
}
$policy = new $policyClassName();
$policy->apply();
}
loadPolicy('AdminPolicy');
?>
この例では、 IS_A()は使用しませんでした。これは、受信クラスがポリシー自体ではなく、ポリシーのサブクラスであることを確認したいからです。ここでis_subclass_of()を使用する方が適切です。
また、オブジェクトが基本クラス自体を含む特定の継承システムのメンバーに属しているかどうかを検出する必要がある場合、 IS_A()がより適切です。
<?php
function isPolicy($obj) {
return is_a($obj, 'Policy');
}
システムメンバーを継承するかどうかを決定する(基本クラスを含む) : is_a()を使用します
サブクラスかどうかを判断します(ベースクラスを除く) : is_subclass_of()を使用します
クラス名とオブジェクトの互換性処理:両方の関数はクラス名とオブジェクトをサポートしていますが、あいまいさを避ける意図を明示的に渡すことをお勧めします。
クラス名リストと判断結果をテーブルに出力するための小さなデバッグスクリプトを記述するか、デバッグツールを使用してクラスの関係を自動的に検証することができます。 M66.NETが提供するPHPオンライン実行環境では、この種の継承判断ロジックをすばやくテストして、開発効率を向上させることができます。
PHPで相続関係の判断を扱う場合、 IS_A()およびIS_SUBCLASS_OF()は、2つの基本的なものですが非常に重要なツールです。それらの違いを理解し、合理的に使用することにより、特にプラグインメカニズム、ポリシーパターン、工場パターンなどのシナリオに関しては、より堅牢なオブジェクト関係の判断ロジックを構築するのに役立ちます。