确定变量是否为特定对象的最佳方法是什么?
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 检查将告诉您给定的对象是否为给定的 class。另一方面,instanceof 运算符会告诉您,如果给定的对象是给定的 class 或在其继承树中具有 class 或实现给定的接口。
一些示例:
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 可以传递字符串、对象或 class 标识符。
第四个选项是:
如果您可以控制对象定义,则将 public 属性 添加到名为 public $_myquirkyparentproperty = true;
的父 class 定义,然后使用 isset($var->_myquirkyparentproperty)
.当您可以控制对象时,这是 PHP 中最快的对象识别。为你的父子classes添加不同的属性,继续使用isset()来区分它们。
这里是一个benchmark(->_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)
确保命名 属性 的名称不会与其他 classes 的属性冲突。也许你的名字。
我最近读到 is_a()
和 instanceof
之间的区别
我目前正在使用 get_class
进行对象比较。我读到 is_a
已被弃用,但尽管 instanceof
稍快一些,但仍应大众需求恢复。您什么时候决定使用这些变体中的每一个,为什么不使用其他变体中的一个?
if (get_class($var) == 'MyObject')
if ($var instanceof \MyObject)
if (is_a($var, \MyObject))
这取决于您真正想要检查的内容。
get_class 检查将告诉您给定的对象是否为给定的 class。另一方面,instanceof 运算符会告诉您,如果给定的对象是给定的 class 或在其继承树中具有 class 或实现给定的接口。
一些示例:
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 可以传递字符串、对象或 class 标识符。
第四个选项是:
如果您可以控制对象定义,则将 public 属性 添加到名为 public $_myquirkyparentproperty = true;
的父 class 定义,然后使用 isset($var->_myquirkyparentproperty)
.当您可以控制对象时,这是 PHP 中最快的对象识别。为你的父子classes添加不同的属性,继续使用isset()来区分它们。
这里是一个benchmark(->_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)
确保命名 属性 的名称不会与其他 classes 的属性冲突。也许你的名字。