`is_a`的`allow_string`参数是什么意思?

时间:2013-07-30 19:56:02

标签: php instanceof

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

更改第三个参数时,该错误消息不会更改。 字符串类名作为对象实际上意味着什么?

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_asubclass_of don't behave exactly like instanceof时,这一切都可能开始了。