php是什么 - is_a和instanceof有什么区别?



php method_exists__ call (6)

instanceof可以与其他对象实例,类的名称或接口一起使用。 我不认为is_a()与接口一起工作(只有一个代表类名的字符串),但如果是的话,请纠正我。 (更新:请参阅https://gist.github.com/1455148

来自instanceof示例:

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)

https://src-bin.com

我知道instanceof是一个运算符, is_a是一个方法。

该方法的性能较慢吗? 你想用什么?


Answer #1

以下是is_a()instanceof性能结果:

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

测试来源在here


Answer #2

优化是最小的。 在代码的可读性,可理解性和稳定性之前,微优化从来都不是真正的好答案。

(personaly我prefere instanceof ,但选择是你的;))

主要区别在于可以使用instanceof直接使用类名

$一个instanceof MyClass

比...短

is_a($ a,MyClass :: class)

(好的...这不是微不足道的。)

instanceof(语言结构)和is_a之间的语法着色也是有用的(对我来说)。 让功能颜色更大的操作。 如果在if中单次使用,instanceof dos不需要更多的括号。

注意:当然,您可以使用较短的直接字符串来代替MyClass :: class:

is_a($ A 'MyClass的')

但是,在代码中使用直接字符串不是一种好的做法

如果你可以在简单的字符串和类名之间做出区别,那么语法上的结合会更好,更有用。 用常量类名更改名称更容易。 特别是如果你使用别名命名空间。

那么,请使用is_a()

同样的理由:可读性和不可变性。 (选择是你的)Specialy使用时 或者其他布尔运算符: is_a似乎更适用于括号。

if($ a AND(!is_a($ a,MyClass :: class)or is_a($ a,MyOtherClass :: class)))

比以下更具可读性:

if($ a AND(!($ a instanceof MyClass)OR($ a intance of MyOtherClass)))

另一个很好的理由是当你需要在函数中使用回调时。 (像array_map ...) instanceof不是一个函数,它是一种语言结构,所以你不能用它作为回调函数。

在这种情况下, is_a可能是有用的


Answer #3

关于ChrisF的回答,从PHP 5.3.0开始, is_a() is_a() 。 我发现像这样的东西通过官方来源总是比较安全。

关于你的问题,丹尼尔,我不能说性能差异,但其中的一部分会降低到可读性,而且你会发现更容易处理。

此外, 还有一些关于否定检查instanceofis_a()有关的混淆的讨论 。 例如, instanceof来说,你可以这样做:

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

vs is_a()的以下内容:

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

要么

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

编辑看起来像ChrisF删除了他的答案,但我的答案的第一部分仍然存在。


Answer #4

我不能说性能 - 我还没有测量任何东西 - 但取决于你尝试的是什么, instanceof有一些限制。 看看我的问题,就在最近,关于它:

PHP'instanceof'失败,类常量

我已经结束了使用is_a 。 我更喜欢instanceof的结构(我认为它更好),并会继续在我可以使用的地方使用它。


Answer #5

除了速度,另一个重要的区别是他们如何处理边缘案例。

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抑制它们时突出显示可能的错误。





php