irc*_*ell 207
实际上,is_a()
是一个函数,而是is_a()
一个语言结构. Object
将显着更慢(因为它具有执行函数调用的所有开销),但在任一方法中总体执行时间都是最小的.
它从5.3开始不再被弃用了,所以不用担心.
但是有一个区别. $allow_string
作为一个函数,一个对象作为参数1,一个字符串(变量,常量或文字)作为参数2.所以:
class MyBaseClass {}
class MyExtendingClass extends MyBaseClass {}
// Original behavior, evaluates to false.
is_a(MyExtendingClass::class, MyBaseClass::class);
// New behavior, evaluates to true.
is_a(MyExtendingClass::class, MyBaseClass::class, true);
Run Code Online (Sandbox Code Playgroud)
false
将对象作为参数1,并且可以将类名(变量),对象实例(变量)或类标识符(不带引号的类名称)作为参数2.
is_a($object, $string); // <- Only way to call it
Run Code Online (Sandbox Code Playgroud)
Ale*_*ruk 46
以下是is_a()和instanceof的性能结果:
Test name Repeats Result Performance
instanceof 10000 0.028343 sec +0.00%
is_a() 10000 0.043927 sec -54.98%
Run Code Online (Sandbox Code Playgroud)
测试源在这里.
Lot*_*tes 10
instanceof
可以与其他对象实例,类的名称或接口一起使用.我不认为它(更新:请参阅https://gist.github.com/1455148)is_a()
适用于接口(只是一个表示类名的字符串),但如果确实如此,请更正.
来自php.net的示例:
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
Run Code Online (Sandbox Code Playgroud)
输出:
bool(true)
bool(true)
bool(false)
Run Code Online (Sandbox Code Playgroud)
有一种情况,只有is_a()
有效,instanceof
才会失败。
instanceof
需要一个字面类名或一个变量,该变量是对象或字符串(带有类名)作为其右参数。
但是,如果您想从函数调用中提供类名的字符串,它将不起作用并导致语法错误。
然而,同样的场景可以很好地使用is_a()
.
例子:
<?php
function getClassName() : string
{
return "Foobar";
}
class Foobar
{
private $xyz;
}
$x = new Foobar();
// this works of course
var_dump($x instanceof Foobar);
// this creates a syntax error
var_dump($x instanceof getClassName());
// this works
var_dump(is_a($x, getClassName()));
Run Code Online (Sandbox Code Playgroud)
这是基于 PHP 7.2.14 的。
关于ChrisF的答案,从PHP 5.3.0开始is_a()
不再被弃用.我发现通过这样的事情的官方来源总是更安全.
关于你的问题,丹尼尔,我不能说性能差异,但部分内容将归结为可读性,你会发现它更容易使用.
此外,还有一些关于否定instanceof
支票vs 的混淆的讨论is_a()
.例如,instanceof
你会这样做:
<?php
if( !($a instanceof A) ) { //... }
?>
Run Code Online (Sandbox Code Playgroud)
以下为is_a()
:
<?php
if( !is_a($a, 'A' ) { //... }
?>
Run Code Online (Sandbox Code Playgroud)
要么
<?php
if( is_a($a, 'A') === FALSE) { //... }
?>
Run Code Online (Sandbox Code Playgroud)
编辑看起来像ChrisF删除了他的答案,但我的答案的第一部分仍然存在.
除了速度之外,另一个重要的区别是它们如何处理边缘情况.
is_a($x1, $x2) // fatal error if x2 is not a string nor an object
$x1 instanceof $x2 // returns false even if $x2 is int, undefined, etc.
Run Code Online (Sandbox Code Playgroud)
因此,is_a()会突出显示可能的错误,而instanceof会抑制它们.