instanceof 运算符是 php 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。
1、用来确定一个变量是否属于某个类的实例;
2、用来确定一个变量是否是继承自某一父类的子类的实例;
3、用来确定一个变量是否是实现了某个接口的对象的实例。
在 php 5.1.0之前,如果要检查的类名称不存在,instanceof 会调用 __autoload()。另外,如果该类没有被装载则会产生一个致命错误。可以通过使用动态类引用(dynamic class reference)或用一个包含类名的字符串变量来避开这种问题:
下面举例说明php instanceof的用法:
if ( ! empty( $current_user ) ) {
if ( $current_user instanceof wp_user )
return;
// upgrade stdclass to wp_user
if ( is_object( $current_user ) && isset( $current_user->id ) ) {
$cur_id = $current_user->id;
$current_user = null;
wp_set_current_user( $cur_id );
return;
}
// $current_user has a junk value. force to wp_user with id 0.
$current_user = null;
wp_set_current_user( 0 );
return false;
}
如代码中高亮的部分,if ( $current_user instanceof wp_user ),wp_user是一个类名,在这里这句话是判断$current_user是否是wp_user这个类的实例。也就是判断前面的代码中是否已经有$current_user=new wp_user()。
使用instanceof这个关键字可以确定一个对象是类的实例、类的子类,还是实现了某个特定接口,并进行相应的操作。
example #6 避免 php 5.0 中 instanceof 引起的类名查找和致命错误问题
代码格式:实例名 instanceof 类名
instanceof 运算符的运用
如下例子可以运行。
class user{
private $name;
public function getname(){
return username is .$this->name;
}
}
class normaluser extends user {
private $age = 99;
public function getage(){
return age is .$this->age;
}
}
class useradmin{ //操作.
public static function getuserinfo(user $_user){
echo $_user->getage();
}
}
$normaluser = new normaluser();
useradmin::getuserinfo($normaluser);
?>
程序运行结果:
age is 99
在user类中因为没有这个方法而报错:
class user{
private $name;
public function getname(){
return username is .$this->name;
}
}
class normaluser extends user {
private $age = 99;
public function getage(){
return age is .$this->age;
}
}
class useradmin{ //操作.
public static function getuserinfo(user $_user){
echo $_user->getage();
}
}
$user = new user(); // 这里new的是user.
useradmin::getuserinfo($user);
?>
程序运行结果:
fatal error: call to undefined method user::getage() in e:\phpprojects\nowamagic\php\php_instanceofoperator.php on line 99
使用instatnceof运算符保障代码安全
使用instatnceof运算符,在操作前先进行类型判断。以保障代码的安全性。
class user{
private $name;
public function getname(){
return username is .$this->name;
}
}
class normaluser extends user {
private $age = 99;
public function getage(){
return age is .$this->age;
}
}
class useradmin{ //操作.
public static function getuserinfo(user $_user){
if($_user instanceof normaluser ){
echo $_user->getage();
}else{
echo 类型不对,不能使用这个方法.;
}
}
}
$user = new user(); // 这里new的是user.
useradmin::getuserinfo($user);
?>
程序运行结果:
类型不对,不能使用这个方法.
这就是php关键字instanceof的用法。
