1

PHP 最近为函数添加了第三个参数is_a。这是一个布尔值,文档说,

如果此参数设置为 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

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

4

1 回答 1

2

答案与子类化有关。在 PHP 5.3.7is_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 行为不完全像 instanceof.

于 2013-07-30T20:02:01.880 回答