• PHP面向对象:instanceof 运算符 (备忘)


    转载:http://www.nowamagic.net/php/php_InstanceofOperator.php

    感谢分享

    在PHP5中,通过方法传递变量的类型有不确定性。于是我们很难判断,一些操作是否可以运行。

    使用instanceof运算符,可以判断当前实例是否可以有这样的一个形态。当前实例使用 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:PHPProjectsNowaMagicphpphp_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);
    ?>

    程序运行结果:类型不对,不能使用这个方法.

    最后

    <?
    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 instanceof NormalUser; // true
            if($_user instanceof User ){ //这里是User
                echo $_user->getAge();
            }else{
                echo "类型不对,不能使用这个方法.";
            }
        }
    }
    $User = new NormalUser(); // 这里new的是NormalUser.
    UserAdmin::getUserInfo($User);
    ?>

    程序运行结果:

    age is 99

    同样证实上面的说法,直白说就是返回在当前实例中类是否有效

  • 相关阅读:
    理解Golang包导入
    go语言执行windows下命令行的方法
    Go中使用动态库C/C++库
    MongoDB · 引擎特性 · MongoDB索引原理
    Linux中more和less命令用法
    修改Linux文件句柄限制
    MongoDB自动删除过期数据--TTL索引
    mongodb可以通过profile来监控数据 (mongodb性能优化)
    MongoDB学习笔记(索引)
    查看nginx cache命中率
  • 原文地址:https://www.cnblogs.com/lazyx/p/4897066.html
Copyright © 2020-2023  润新知