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
可以与其他对象实例,类的名称或接口一起使用。 我不认为 (更新:见https://gist.github.com/1455148 ) is_a()
与接口(仅代表类名称的string)一起工作,但是如果是的话就纠正我。
来自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,我不能说性能上的差异,但是其中的一部分会降低到可读性,而且更容易处理。
此外, 还有一些关于否定检查instanceof
与is_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)