我知道instanceof是一个操作符,is_a是一个方法。

该方法的性能是否较慢?你更喜欢用什么?


当前回答

下面是is_a()和instanceof的性能结果:

Test name       Repeats         Result          Performance     
instanceof      10000           0.028343 sec    +0.00%
is_a()          10000           0.043927 sec    -54.98%

测试源在这里。

其他回答

除了速度,另一个重要的区别是如何处理边缘情况。

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.

因此,is_a()突出显示可能的错误,而instanceof抑制它们。

Instanceof可以与其他对象实例、类名或接口一起使用。我不认为is_a()工作与接口(只有一个字符串表示类名),但纠正我,如果它这样做。(更新:见https://gist.github.com/1455148)

来自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'

输出:

bool(true)
bool(true)
bool(false)

关于ChrisF的回答,is_a()从PHP 5.3.0起不再弃用。我发现这种事还是听官方消息比较安全。

关于你的问题,丹尼尔,我不能说性能上的差异,但部分原因在于可读性,以及你觉得哪个更容易使用。

此外,还有一些关于否定instanceof check与is_a()的混淆的讨论。例如,instanceof你会这样做:

<?php
if( !($a instanceof A) ) { //... }
?>

Vs is_a():

<?php
if( !is_a($a, 'A' ) { //... }
?>

or

<?php
if( is_a($a, 'A') === FALSE) { //... }
?>

看起来ChrisF删除了他的答案,但我的答案的第一部分仍然有效。

关于is_a()有一件有趣的事情需要注意:如果你正在为你的类使用自动加载器、名称空间和别名,你将需要在is_a()上使用你的类的真实和全名,因为这个方法不能很好地理解你的上下文中的什么是什么。另一方面,Instanceof理解它。

例如(不是双关语):

<?php
namespace MyNamespace;

use \MyNamespace\User;
use \MyNamespace\Thing as Something;

class Test
{
    public function doTest()
    {
        $user = new User();
        var_dump(is_a($user, "User")); // false
        var_dump(is_a($user, "\MyNamespace\User")); // true
        var_dump($user instanceof User); // true
        var_dump($user instanceof \MyNamespace\User); // true
    }

    public function doAnotherTest()
    {
        $something = new Something();
        var_dump(is_a($something, "Something")); // false
        var_dump(is_a($something, "\MyNamespace\Thing")); // true
        var_dump($something instanceof Thing); // true
        var_dump($something instanceof \MyNamespace\Thing); // true
    }
}

下面是is_a()和instanceof的性能结果:

Test name       Repeats         Result          Performance     
instanceof      10000           0.028343 sec    +0.00%
is_a()          10000           0.043927 sec    -54.98%

测试源在这里。