什么';这是确定变量是否为特定对象的最佳方法


What's the best way to determine if a variable is a particular object?

我最近读到关于is_a()instanceof之间的区别我目前正在使用get_class进行对象比较。我读到is_a被弃用,但由于流行需求而恢复,尽管instanceof稍微快一点。你什么时候决定使用这些变体中的每一个,为什么不使用其他变体中的一个呢?

if (get_class($var) == 'MyObject')
if ($var instanceof 'MyObject)
if (is_a($var, 'MyObject))

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

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

一些例子:

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

第四个选项是:

如果您可以控制对象定义,那么将一个名为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)

请确保将属性命名为不会与其他类的属性冲突的名称。也许是你的名字。