Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';确定变量是否为特定对象的最佳方法是什么?_Php_Oop_Instanceof - Fatal编程技术网

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

Php 什么';确定变量是否为特定对象的最佳方法是什么?,php,oop,instanceof,Php,Oop,Instanceof,我最近读到关于is_a()和instanceof 我目前正在使用get\u class进行对象比较。我读到,is_a被弃用,但受大众需求的影响,尽管instanceof稍微快一点。您什么时候决定使用这些变体中的每一个,为什么不使用其他变体中的一个呢 if (get_class($var) == 'MyObject') if ($var instanceof \MyObject) if (is_a($var, \MyObject)) 这取决于你真正想检查什么 获取类检查将告诉您给定对象是否属

我最近读到关于
is_a()
instanceof
我目前正在使用
get\u class
进行对象比较。我读到,
is_a
被弃用,但受大众需求的影响,尽管
instanceof
稍微快一点。您什么时候决定使用这些变体中的每一个,为什么不使用其他变体中的一个呢

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

if ($var instanceof \MyObject)

if (is_a($var, \MyObject))

这取决于你真正想检查什么

获取类检查将告诉您给定对象是否属于给定类<另一方面,strong>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$\u myquirkyparentproperty=true的公共属性,然后使用isset($var->\u myquirkyparentproperty)
。这是PHP中最快的对象标识,当您可以控制对象时。向父类和子类添加不同的属性,并继续使用isset()区分它们

这是一个基准(->\u srf\u 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)
确保将属性命名为不会与其他类的属性冲突的名称。也许是你的名字