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)); // エラーデモンストレーション
現時点ではどうなりますか?分析しましょう:
最初の引数は、オブジェクトではなく、文字列「動物」です。
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_stringがtrueである場合、クラス名文字列です)、2番目のパラメーターはクラス名文字列でなければなりません。
パラメーターの順序を逆転させると、タイプの不一致が発生し、PHPは虚偽を警告して返し、判断が無効になります。
パラメーター転送エラーのために発見するのが難しい論理的な脆弱性を回避するために、開発のパラメーター順序に特に注意を払う必要があります。