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

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

原文地址:https://www.cnblogs.com/lazyx/p/4897066.html