您的位置:威尼斯官方网站 > 威尼斯正规官网 > 2、用来确定一个变量是否是继承自某一父类的子

2、用来确定一个变量是否是继承自某一父类的子

发布时间:2019-08-05 17:09编辑:威尼斯正规官网浏览(90)

    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 引起的类名查找和致命错误问题

    <?php
    $d = 'NotMyClass';
    var_dump($a instanceof $d); // no fatal error here
    ?>

    代码格式:实例名 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的用法。

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:2、用来确定一个变量是否是继承自某一父类的子

    关键词:

上一篇:php循环控制语句

下一篇:没有了