在 PHP 中,is_a() 函数是用来检测一个对象是否属于某个类或者类的子类,语法如下:
is_a(object $object, string $class_name, bool $allow_string = false): bool
其中,第一个参数必须是对象或对象名,第二个参数是类名。如果把这两个参数顺序颠倒,代码会产生什么后果呢?本文将通过实例来分析 is_a() 用错参数顺序时的表现与潜在风险。
假设有如下两个类:
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 对象确实属于 Animal 这个类或其子类。
如果把参数顺序反过来写,比如:
var_dump(is_a('Animal', $dog)); // 错误示范
这时会发生什么呢?让我们分析:
第一个参数是字符串 'Animal',而不是对象。
第二个参数是对象 $dog,而不是类名字符串。
根据 is_a() 的定义,函数期望第一个参数是对象,第二个参数是字符串类名,顺序颠倒导致类型不匹配。
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() 允许第三个参数 $allow_string 设置为 true,以支持第一个参数传入类名字符串而非对象:
var_dump(is_a('Dog', 'Animal', true)); // true,判断 Dog 是否继承 Animal
但是即使在这种情况下,第二个参数仍必须是字符串类名,颠倒顺序仍然出错:
var_dump(is_a('Animal', $dog, true)); // 依然错误,参数顺序颠倒
is_a() 函数的第一个参数必须是对象(或者当 $allow_string 为 true 时,是类名字符串),第二个参数必须是类名字符串。
颠倒参数顺序会导致类型不匹配,PHP 会报警告并返回 false,判断失效。
开发中应特别注意参数顺序,避免因传参错误而导致难以发现的逻辑漏洞。