【问题标题】:What's the best way to determine if a variable is a particular object?确定变量是否为特定对象的最佳方法是什么?
【发布时间】:2016-05-13 15:20:02
【问题描述】:

我最近读到了is_a()instanceof 之间的区别 我目前正在使用get_class 进行对象比较。我读到is_a 已被弃用,但被大众需求带回来,尽管instanceof 稍快一些。您什么时候决定使用这些变体中的每一个,为什么不使用其他变体?

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

if ($var instanceof \MyObject)

if (is_a($var, \MyObject))

【问题讨论】:

    标签: php oop instanceof


    【解决方案1】:

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

    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 运算符相同,但速度会慢一些。在更大的应用程序中,性能差异可以忽略不计。

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

    【讨论】:

      【解决方案2】:

      第四个选项是:

      如果您可以控制对象定义,则将公共属性添加到名为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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2023-03-24
        相关资源
        最近更新 更多