我知道instanceof是一个操作符,is_a是一个方法。
该方法的性能是否较慢?你更喜欢用什么?
我知道instanceof是一个操作符,is_a是一个方法。
该方法的性能是否较慢?你更喜欢用什么?
当前回答
优化是最小的。在代码的可读性、可理解性和稳定性面前,微优化从来都不是一个真正的好答案。
(个人而言,我更喜欢instanceof,但选择是你的;))
主要的区别是可以使用instanceof的直接类名
$一个MyClass实例
短于
is_a($a, MyClass::class)
(好吧,这不是小事。)
instanceof(语言结构)和is_a之间的语法颜色也很有用(对我来说)。让函数为更大的运算上色。 如果在if中单独使用,instanceof不需要更多的括号。
注意: 当然,你可以使用更短的直接字符串来代替MyClass::class:
is_a ($ a,“MyClass”)
但是在代码中使用直接字符串并不是一个好的实践。
如果可以区分简单字符串和类名,那么语法排序会更好,也更有用。 使用常量classname更容易更改名称。如果使用带有别名的命名空间,则具有特殊性。
那么,wy使用is_a() ?
出于同样的原因:可读性和不可理解性。(选择权在你) 与!或者其他布尔运算符:is_a用圆括号似乎更实用。
if($a AND (!is_a ($a, MyClass::class)或is_a ($a, MyOtherClass::class)))
比:
if($a AND (!($a instanceof MyClass)或($a instanceof MyOtherClass))
另一个很好的理由是当你需要在函数中使用回调时。(像array_map…) Instanceof不是一个函数,它是一个语言结构,所以你不能把它用作回调。
在这种情况下,is_a可能很有用
其他回答
我不能谈论性能——我还没有测量过任何东西——但根据您的尝试,instanceof有局限性。看看我最近提出的问题:
PHP 'instanceof'类常量失败
我最终使用了is_a。我更喜欢instanceof的结构(我认为它读起来更好),并将继续在我可以使用的地方使用它。
关于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%
测试源在这里。
有一种情况是,只有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()));
这是基于PHP 7.2.14的。
优化是最小的。在代码的可读性、可理解性和稳定性面前,微优化从来都不是一个真正的好答案。
(个人而言,我更喜欢instanceof,但选择是你的;))
主要的区别是可以使用instanceof的直接类名
$一个MyClass实例
短于
is_a($a, MyClass::class)
(好吧,这不是小事。)
instanceof(语言结构)和is_a之间的语法颜色也很有用(对我来说)。让函数为更大的运算上色。 如果在if中单独使用,instanceof不需要更多的括号。
注意: 当然,你可以使用更短的直接字符串来代替MyClass::class:
is_a ($ a,“MyClass”)
但是在代码中使用直接字符串并不是一个好的实践。
如果可以区分简单字符串和类名,那么语法排序会更好,也更有用。 使用常量classname更容易更改名称。如果使用带有别名的命名空间,则具有特殊性。
那么,wy使用is_a() ?
出于同样的原因:可读性和不可理解性。(选择权在你) 与!或者其他布尔运算符:is_a用圆括号似乎更实用。
if($a AND (!is_a ($a, MyClass::class)或is_a ($a, MyOtherClass::class)))
比:
if($a AND (!($a instanceof MyClass)或($a instanceof MyOtherClass))
另一个很好的理由是当你需要在函数中使用回调时。(像array_map…) Instanceof不是一个函数,它是一个语言结构,所以你不能把它用作回调。
在这种情况下,is_a可能很有用