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:\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);
?>

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

最后

<?
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

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

时间: 2024-11-10 07:56:42

PHP面向对象:instanceof 运算符 (备忘)的相关文章

Annotation 使用备忘

title: Annotation 使用备忘 date: 2016-11-16 23:16:43 tags: [Annotation] categories: [Programming,Java] --- 概述 本文记录注解 Annotation 的概念和使用. Annotation 注解 Why 需要注解 在代码中常有些重复的代码,这些代码纯手工太耗时.可以通过一定的标记,然后处理即可. What 是注解? Annotation 分类 标准 Annotation 包括 Override, De

代码整洁备忘(一)

无聊在看<代码整洁之道>,找到了一些自己以前没有注意的地方,在这里记录下来,备忘一下. 目前看完了第九章. 1.重复很多的代码是不好的,需要仔细考虑去掉无用的重复. 2.变量,函数,类等的命名要足够精确,精简&易于搜索. 3.函数尽可能的少用参数(3个以内),&不要向函数内传递bool,因为这明确的说明了这个函数干的不是一件事!函数的职责应该是单一的.函数应该尽可能的短小,过长的函数是不好的. 4.注释,能不用就不用,能少用就少用.能用好的名字说明的问题就不要用注释来说明.标记

Objective-C教程备忘单

终极版本的Objective-C教程备忘单帮助你进行iOS开发. 想开始创建你的第一个iOS应用程序么?那么看一下这篇很棒的教程吧:Create your first iOS 7 Hello World Application 注:这篇文章我写了三天,可能在一些必要的地方使用了编辑和说明,所以如果有任何疑问和修改建议请在下方评论. 这不是一个初学者指南,也不是关于Objective-C的详细讨论,这是关于常见的和高水平的论题的快速索引. 如果这里有些问题没有涉及到,你也可以查阅以下文章: Obj

tips instanceof运算符和typeof运算符的区别

tips instanceof运算符和typeof运算符的区别  一.instanceof运算符:       此运算符可以判断一个变量是否是某个对象(类)的实例,返回值是布尔类型的(true和false).想要理解它的作用,必须对面向对象有所理解: 代码实例如下: var str=new String("foodoir"); var str2="foodoir"; console.log(str instanceof String); //true console

备忘“与”、“非”、“或”、“异或” 运算

位运算符主要针对二进制,它包括了:"与"."非"."或"."异或".从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符与运算符用符号"&"表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段.public class data13{public st

Mysql又一次整理笔记--woods备忘

==============================SQL备忘 CRUD 查询 多表 事件等=============================== -------------------------------------------------------------------------------------------------- 一.数据库 1.创建数据库 create database [if not exists] db_name [character set

JavaScript instanceof 运算符深入剖析

instanceof 运算符简介 在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object".ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题.instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型.与 typeof 方法不同的是,instanceof 方法要求开发者明确地确

代码备忘, TODO宏实现

代码备忘, TODO宏实现 我们平时在开发过程中, 往往并不是憋足气一股脑敲完全部代码.每个模块, 每个函数的实现总有个先后顺序.又或者哪个部分需要做调整, 修改- 所以, 我们需要有一个东西, 来提醒我们, 起到代码备忘功能, 避免某个功能忘记实现, 也能让我们快速定位. 所以这篇文章, 就是要实现一个TODO宏, 来达到代码备忘功能. 效果如下: 下面来分析下如何实现这个宏 在实现TODO之前, 已经自带了几个预处理指令来实现报警/报错: #warning Colin #error Coli

11. 星际争霸之php设计模式--备忘模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248190.html============================================