is_a和instanceof有什么区别?

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

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

实际上, is_a是一个函数,而instanceof是一个语言结构。 is_a将会明显变慢(因为它具有执行函数调用的所有开销),但是两种方法的整体执行时间是最小的。

从5.3开始不再弃用,所以这里没有什么担心的。

但是有一个区别。 is_a是一个函数,它将一个对象作为参数1,将一个string(variables,常量或文字)作为参数2。

 is_a($object, $string); // <- Only way to call it 

instanceof将一个对象作为参数1,并可以将类名(variables),对象实例(variables)或类标识符(不带引号的类名)作为参数2。

 $object instanceof $string; // <- string class name $object instanceof $otherObject; // <- object instance $object instanceof ClassName; // <- identifier for the class 

这是is_a()instanceof的性能结果:

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

testing来源在这里 。

instanceof可以与其他对象实例,类的名称或接口一起使用。 我不认为is_a()与接口(仅代表类名称的string)一起工作,但是如果是的话就纠正我。 (更新:见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的回答,从PHP 5.3.0开始, is_a() 不再被弃用 。 我发现这样的事情总是比较安全的。

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

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

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

vs is_a()的以下内容:

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

要么

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

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

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

(personaly我prefere 实例 ,但select是你的;))

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

$一个instanceof MyClass

比…短

is_a($ a,MyClass :: class)

(好的,这不是微不足道的)

instanceof(语言结构)和is_a之间的语法着色也是有用的(对我来说)。 让function颜色更大的操作。 而对于一次使用if,instanceof dos不需要更多的括号。

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

is_a($ A 'MyClass的')

但在代码中使用直接string不是一个好的做法

如果你可以在简单的string和类名之间做出区别,那么语法上的调整就更好,更有用。 用常量的类名更改名称更容易。 特别是如果你使用名称空间别名。

所以,你使用is_a()

同样的理由:可读性和不可变性。 (select是你的)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 intanceof MyOtherClass)))

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

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

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

 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限制。 看看我的问题,就在最近,关于它:

PHP的“instanceof”与类常量失败

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

以下是从这里获得的性能结果:

instanceof更快。

function

 function method_1($a = null) { return is_object($a) && is_a($a, 'Example'); } function method_2($a = null) { return is_a((object) $a, 'Example'); } function method_3($a = null) { return $a instanceof 'Example'; } 

次(每次运行5000次)

 0.00573397 // method_1(5) 0.01437402 // method_2(5) 0.00376201 // method_3(5)