現在の位置: ホーム> 最新記事一覧> IS_A()間違った順序で:オブジェクトとクラス名のパラメーターを反転させる結果

IS_A()間違った順序で:オブジェクトとクラス名のパラメーターを反転させる結果

M66 2025-05-29

PHPでは、 IS_A()関数を使用して、オブジェクトがクラスの特定のクラスまたはサブクラスに属しているかどうかを検出します。構文は次のとおりです。

 is_a(object $object, string $class_name, bool $allow_string = false): bool

その中で、最初のパラメーターはオブジェクトまたはオブジェクト名でなければならず、2番目のパラメーターはクラス名です。これら2つのパラメーターの順序が逆になった場合、コードには何がありますか?この記事では、例を使用して、間違ったパラメーター順序を使用する場合のIS_A()のパフォーマンスと潜在的なリスクを分析します。


正しい使用法の例

2つのカテゴリがあるとします。

 class Animal {}
class Dog extends Animal {}

$dog = new Dog();

var_dump(is_a($dog, 'Animal'));   // true,Dog はい Animal のサブクラス
var_dump(is_a($dog, 'Dog'));      // true,$dog はい Dog 例

このコードでは、 is_a($ dog、 'animal')trueを返し、 $ dogオブジェクトが動物クラスまたはそのサブクラスに属していることを示します。


エラーの使用例:パラメーター順序が逆転します

たとえば、パラメーターの順序を逆に書いた場合:

 var_dump(is_a('Animal', $dog));  // エラーデモンストレーション

現時点ではどうなりますか?分析しましょう:

  1. 最初の引数は、オブジェクトではなく、文字列「動物」です。

  2. 2番目のパラメーターは、クラス名文字列ではなく、オブジェクト$ dogです。

IS_A()の定義によれば、関数は最初のパラメーターがオブジェクトであり、2番目のパラメーターは文字列クラス名であることを期待し、順序はタイプのミスマッチを引き起こすように逆転します。


本当の結果

  • PHP 7.2以降は、次のような警告やエラーを投げます

 Warning: is_a() expects parameter 1 to be object, string given
  • 関数はfalseを返し、正しく判断することはできません。

  • コードロジックは失敗し、判断に失敗します。

サンプルコード:

 $dog = new Dog();
var_dump(is_a('Animal', $dog)); // false,と警告

文字列が最初のパラメーターとして許可されている特別なケース

is_a()を使用すると、3番目のパラメーター$ allow_stringをtrueに設定して、オブジェクトの代わりにクラス名文字列に渡される最初のパラメーターをサポートすることができます。

 var_dump(is_a('Dog', 'Animal', true));  // true,判断 Dog はい否继承 Animal

ただし、この場合でも、2番目のパラメーターは文字列クラス名でなければならず、逆の順序はエラーです。

 var_dump(is_a('Animal', $dog, true)); // まだ間違っています,パラメーター順序は反転しました

まとめ

  • IS_A()関数の最初のパラメーターはオブジェクトである必要があります(または$ aopt_stringtrueである場合、クラス名文字列です)、2番目のパラメーターはクラス名文字列でなければなりません。

  • パラメーターの順序を逆転させると、タイプの不一致が発生し、PHPは虚偽を警告して返し、判断が無効になります。

  • パラメーター転送エラーのために発見するのが難しい論理的な脆弱性を回避するために、開発のパラメーター順序に特に注意を払う必要があります。