PHP instanceof运算符
PHP中使用instanceof运算符来确定对象是否是类的实例化实例。它非常易于使用,并且以与其他运算符相同的方式工作。这对于控制大型应用程序中的对象很有用,因为您可以在使用参数之前确保参数是对象的特定实例。让我们创建几个类作为示例。
class Shape { } class Circle extends Shape { }
现在,要确定变量是否为Shape类的实例,请创建对象,然后在该对象上使用instanceof运算符。以下代码返回true。
$shape = new Shape(); var_dump($shape instanceof Shape); //真的
请注意,上面的Circle类扩展了Shape类。instanceof运算符将同时使用该类的一个实例和父类。如果不小心,可能会导致应用程序中的错误。
$circle = new Circle(); var_dump($circle instanceof Shape); //真的 var_dump($circle instanceof Circle); //真的
也可以否定此运算符,以查看变量是否不是对象的实例。查看变量是否不是运算符的实例并尽早从函数返回false很有用。否定运算符将使您可以执行此操作,甚至可以引发异常。
有两种合法的方法可以否定instanceof运算符。通过将调用括在括号中,然后像这样否定它:
var_dump(!($shapeinstanceofShape));//false
或通过简单地将否定参数添加到变量中,如下所示:
var_dump(!$shapeinstanceofShape);//false
有了这段代码,现在可以执行以下操作。
function doObject($param) { if (!$param instanceof TheObject) { return false; } //restofcodehere... }
还有其他方法可以使用instanceof运算符,而不仅仅是使用类名。您可以在instanceof运算符的右侧使用两种其他类型的参数。首先是将类名定义为变量中的字符串,然后传递该变量。
$class = 'Circle'; var_dump($circle instanceof $class); //真的
第二个是通过传递对象本身的实例。下面的示例创建两个对象,并将它们本质上进行比较。
$circle1 = 'Circle'; $circle2 = 'Circle'; var_dump($circle1 instanceof $circle2); //真的
但是,有两种非常好的打破此功能的好方法,因此也可以破坏您的代码。第一种是通过传递一个字符串作为类名。这会导致解析错误。
var_dump($circleinstanceof'Circle');
第二种方法是将未设置的变量作为参数的右侧传递。这将导致致命错误,因为instanceof运算符需要有效的对象或字符串。
var_dump($notandobjectinstanceof$notavariable);
请注意,只要右侧包含所有重要的字符串或对象,运算符就可以在左侧接受一个未设置的变量。如您所料,这将返回false,因为该对象不是该类的实例。
var_dump($notandobjectinstanceof$shape);//false