PHP最近在is_a
函数中添加了third argument。它是一个布尔值,文档说,
如果此参数设置为FALSE,则不允许将字符串类名称作为对象。如果该类不存在,这也可以防止调用自动加载器。
我不明白。我知道你可以防止不必要地调用自动加载器,但它不会阻止你将字符串作为类名传递:
> class A {}
> $x = new A();
> echo is_a($x, 'A', false);
1
...实际上,你无法传递任何但字符串:
> echo is_a($x, A, false);
PHP Notice: Use of undefined constant B - assumed 'A' in php shell code on line 1
PHP Stack trace:
PHP 1. {main}() php shell code:0
Notice: Use of undefined constant B - assumed 'A' in php shell code on line 1
Call Stack:
18.7644 625048 1. {main}() php shell code:0
1
更改第三个参数时,该错误消息不会更改。 字符串类名作为对象实际上意味着什么?
答案 0 :(得分:2)
答案与子类化有关。在PHP 5.3.7 is_a
已更改,以便如果第一个参数不是对象,PHP将__autoload
该参数,有效地尝试使其成为对象:
> class A {}
> class B extends A {}
> echo is_a('B', 'A');
> // nada
> echo is_a('B', 'A', true);
1
毋庸置疑,这会导致一些意想不到的副作用和减速,因此添加第三个参数可让您选择所需的行为。
当有人发现is_a
和subclass_of
don't behave exactly like instanceof
时,这一切都可能开始了。