IS_A()関数の基本的な構文は次のとおりです。
<code> is_a(object | string $ object_or_class、string $ class、bool $ awal_string = false):bool </code>$ object_or_classは、オブジェクトまたはクラス名(文字列)です。
$クラスは、検出されるターゲットクラスまたはインターフェイス名です。
$ Allow_Stringは、最初のパラメーターが文字列(クラス名)であることが許可されているかどうかを決定し、デフォルトはfalseになります。
例:
<code> interface loggerinterface {}クラスFileLoggerはLoggerInterfaceを実装しています{}
$ logger = new filelogger();
var_dump(is_a($ logger、loggerinterface :: class)); //出力:bool(true)
</code>
IS_A()を使用してインターフェイスを確認する場合、オブジェクトがインターフェイスを実装するかどうかを検出し、親クラスがインターフェイスを間接的に実装するかどうかを確認しません。これは、いくつかの静的分析ツールの動作とは異なります。
<code>インターフェイスa {}インターフェイスbは{}を拡張しますクラスmyclassはb {}を実装します
$ obj = new MyClass();
// 正しい
var_dump(is_a($ obj、b :: class)); // bool(true)
//また、bがaを継承するため、正しい
var_dump(is_a($ obj、a :: class)); // bool(true)
</code>
結論:インターフェイス継承チェーンはIS_A()によって考慮されます。これは、「直接」インターフェイスの実装のみをチェックするいくつかの方法とは異なります。
オブジェクトではなくクラス名の文字列が渡される場合、3番目のパラメーター$ aopt_stringをtrueに設定する必要があります。
<code>インターフェイスサービス{}クラスApiserviceはサービス{}を実装します
$ classname = apiservice :: class;
var_dump(is_a($ classname、service :: class、true)); // bool(true)
</code>
3番目のパラメーターが省略またはfalseに設定されると、上記のコードがfalseを返します。
is_a()を使用する場合、インターフェイス名は完全に適格なクラス名(つまり、名前空間を含む)である必要があります。これは、オートローディングメカニズムまたはより複雑な名前空間構造を使用する場合に特に重要です。
例えば:
<code> namespace app \ services;Interface PaymentInterface {}
クラスPayPalserviceを実装しますPaymentInterface {}
</code>
テストに注意してください:
<code> app \ services \ paypalserviceを使用します。 App \ Services \ PaymentInterfaceを使用します。$ service = new PayPalservice();
var_dump(is_a($ service、paybureinterface :: class)); // bool(true)
</code>
それ以外の場合は、特にインターフェイス名が間違っている場合、または使用がインポートされていない場合、 falseが返される場合があります。
is_a()はオブジェクトインスタンスの検査で一貫して動作しますが、インスタンスはパフォーマンスとコードの読みやすさの点で優れています。例えば:
<code> if($ logger instanceof loggerinterface){//推奨} </code>文字列形式でクラス名を動的に判断する必要がない限り、最初にinstanceofを使用することをお勧めします。
インターフェイス自体をインスタンス化することはできませんが、あるインターフェイスが別のインターフェイスを継承するかどうかを確認できます。これは、コンテナにクラスを反映または自動的に登録する場合に役立ちます。
<code> interface baseinterface {} interface subinterfaceはbaseinterface {}を拡張しますvar_dump(is_a(subinterface :: class、baseinterface :: class、true)); // bool(true)
</code>
この使用法は通常、 class_implements()などの関数で使用され、特にコンテナスキャンに適しています。
<code> $ classes = ['m66.net/service/alphaservice.php'、 'm66.net/service/betaservice.php']; foreach($ classes as $ classpath){
//クラスを反映または動的にロードした後、インターフェイスを実装するかどうかを確認します
$ class = get_class_from_file($ classpath); //この関数を実装するとします
if (is_a($class, \App\Contracts\HandlerInterface::class, true)) {
// 登録サービス
}
}
</code>