确定变量是否是特定对象的最佳方法是什么?

时间:2016-05-13 15:20:03

标签: php oop instanceof

我最近阅读了is_a()instanceof之间的区别 我目前正在使用get_class进行对象比较。我读到is_a已被弃用,但受到大众需求的影响,即使instanceof略快一些。您何时决定使用这些变体,为什么不使用其他变体呢?

if (get_class($var) == 'MyObject')

if ($var instanceof \MyObject)

if (is_a($var, \MyObject))

2 个答案:

答案 0 :(得分:1)

这取决于你真正想要检查的内容。

get_class 检查会告诉您给定的对象是否属于给定的类。另一方面, instanceof 运算符将告诉您,如果给定的对象是给定的类,或者在其继承树中具有该类,则OR实现给定的接口。

一些例子:

class Parent {}
class Child extends Parent {}

$obj = new Child;

var_dump($obj instanceof Parent); // true
var_dump(get_class($obj) === 'Parent'); // false
var_dump($obj instanceof Child); // true
var_dump(get_class($obj) === 'Child'); // true

因此,可以根据您的需要使用两种方式。

关于 is_a(),它的行为与 instanceof 运算符相同,但知道速度稍慢。在更大的应用中,性能差异可以忽略不计。

instanceof 提供了更大的灵活性。虽然 is_a()只接受字符串作为其第二个参数,但 instanceof 可以传递字符串,对象或类标识符。

答案 1 :(得分:1)

第四个选项是:

如果您可以控制对象定义,则将公共属性添加到名为public $_myquirkyparentproperty = true;的父类定义中,然后使用isset($var->_myquirkyparentproperty)。当您控制对象时,这是PHP中最快的对象识别。为父类和子类添加不同的属性,并继续使用isset()来区分它们。

这是一个基准( - > _srf_object是我的个人对象属性),$ a是我的对象:

 MIN: time ratio (500x), fastest times (least interference)
 [1."(isset($a->_srf_object))"] => 1.00x    (5.006790161132812E-6)
 [2."(get_class($a))"] => 2.62x (1.311302185058594E-5)

确保将属性命名为不会与其他类的属性发生冲突的内容。也许是你的名字。