首页 后端开发 php教程 PHP5面向对象详解 - (10) __set() __get() __isset() __unset()四个方法_PHP教程

PHP5面向对象详解 - (10) __set() __get() __isset() __unset()四个方法_PHP教程

Jul 13, 2016 pm 05:13 PM
get isset p php5 set unset 一下 介绍 关于 对象 文章 方法 简单 详解 面向

本文章简单的介绍一下关于PHP5面向对象详解 - (10) __set() __get() __isset() __unset()四个方法,有需要发解的朋友可以参考一下。

__set() __get() __isset() __unset() 四个方法的应用
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。

上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,”__set()”和“__get()”这两个方法,这两个方法不是默认存在的, 而是我们手工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:

 代码如下 复制代码


//__get()方法用来获取私有属性  
function __get($property_name)  
{  
    if(isset($this->$property_name)) {  
        return($this->$property_name);  
    }else {  
        return(NULL);  
    }  
}   
 
//__set()方法用来设置私有属性  
function __set($property_name, $value)  
{  
    $this->$property_name = $value;  

//__get()方法用来获取私有属性
function __get($property_name)
{
    if(isset($this->$property_name)) {
        return($this->$property_name);
    }else {
        return(NULL);
    }
}

//__set()方法用来设置私有属性
function __set($property_name, $value)
{
 $this->$property_name = $value;
}__

get() 方法:这个方法用来获取私有成员属性值的,有一个参数, 参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用, 是在直接获取私有属性的时候自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:”echo $p1->name” 这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用”echo $p1->name” 这样的语句直接获取值的时候就会自动调用__get($property_name)方法,将属性name传给参数$property_name,通过这个方法的内部执行,返回我们传入的私有属性的值。

__set() 方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上了, 如果没有__set()这个方法,是不允许的, 比如:”$this->name=’zhangsan’ , 这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值”zhangsan”传给$value,通过这个方法的执行,达到赋值的目的, 为了不传入非法的值, 还可以在这个方法给做一下判断。代码如下:

 

 代码如下 复制代码

class Person  
{  
    //下面是人的成员属性, 都是封装的私有成员  
    private $name;  //人的名子  
    private $sex;    //人的性别  
    private $age;    //人的年龄  
 
    //__get()方法用来获取私有属性  
    function __get($property_name)  
    {  
        echo "在直接获取私有属性值的时候,自动调用了这个__get()方法
";  
        if(isset($this->$property_name)) {  
            return($this->$property_name);  
        }else {  
            return(NULL);  
        }  
    }   
 
    //__set()方法用来设置私有属性  
    function __set($property_name, $value)  
    {  
        echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
";  
        $this->$property_name = $value;  
    }  
}  
 
$p1=new Person();  
 
//直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值  
$p1->name="张三";  
$p1->sex="男";  
$p1->age=20;  
 
//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值  
echo "姓名:".$p1->name."
";  
echo "性别:".$p1->sex."
";  
echo "年龄:".$p1->age."
"; 

class Person
{
    //下面是人的成员属性, 都是封装的私有成员
    private $name;  //人的名子
    private $sex;    //人的性别
    private $age;    //人的年龄

    //__get()方法用来获取私有属性
    function __get($property_name)
    {
        echo "在直接获取私有属性值的时候,自动调用了这个__get()方法
";
        if(isset($this->$property_name)) {
            return($this->$property_name);
        }else {
            return(NULL);
        }
 }

    //__set()方法用来设置私有属性
    function __set($property_name, $value)
    {
        echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
";
        $this->$property_name = $value;
    }
}

$p1=new Person();

//直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值
$p1->name="张三";
$p1->sex="男";
$p1->age=20;

//直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo "姓名:".$p1->name."
";
echo "性别:".$p1->sex."
";
echo "年龄:".$p1->age."
";

程序执行结果:
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个__get()方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个__get()方法
性别:男
在直接获取私有属性值的时候,自动调用了这个__get()方法
年龄:20

以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。

__isset() 方法:在看这个方法之前我们看一下 isset() 函数的应用,isset() 是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回 true,否则传回 false。

那 么如果在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种情况,如果对象里面成员是公有的,我们就可以 使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使 用“isset()”函数来测定私有成员属性是否被设定了呢?可以,你只要在类里面加上一个“__isset()”方法就可以了,当在类外部使用 “isset()”函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的“__isset()”方法了帮我们完成这样的操 作,“__isset()”方法也可以做成私有的。你可以在类里面加上下面这样的代码就可以了:

 

 代码如下 复制代码

private function __isset($nm)  
{  
    echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用";  
    return isset($this->$nm);  

private function __isset($nm)
{
 echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用";
 return isset($this->$nm);
}

__unset() 方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()” 这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象 外部去删除对象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个 对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果 对象的成员属性是私有的,我使用这个函数就没有权限去删除,但同样如果你在一个对象里 面加上“__unset()”这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象 里面加上了“__unset()”这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有 成员属性时,自动调用“__unset()”函数来帮我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下面的代码 就可以了:

 

 代码如下 复制代码

private function __unset($nm)  
{  
    echo "当在类外部使用unset()函数来删除私有成员时自动调用的";  
    unset($this->$nm);  

private function __unset($nm)
{
 echo "当在类外部使用unset()函数来删除私有成员时自动调用的";
 unset($this->$nm);
}我们来看一个完整的实例:


class Person  
{  
    // 下面是人的成员属性  
    private $name; // 人的名字  
    private $sex; // 人的性别  
    private $age; // 人的年龄  
    //__get()方法用来获取私有属性  
    private function __get($property_name)  
    {  
        if (isset($this->$property_name)) {  
            return($this->$property_name);  
        } else {  
            return(NULL);  
        }  
    }  
    // __set()方法用来设置私有属性  
    private function __set($property_name, $value)  
    {  
        $this->$property_name = $value;  
    }  
    // __isset()方法  
    private function __isset($nm)  
    {  
        echo "isset()函数测定私有成员时,自动调用";  
        return isset($this->$nm);  
    }  
    // __unset()方法  
    private function __unset($nm)  
    {  
        echo "当在类外部使用unset()函数来删除私有成员时自动调用的";  
        unset($this->$nm);  
    }  
}  
$p1 = new Person();  
$p1->name = "this is a person name";  
// 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true  
echo var_dump(isset($p1->name)) . "";  
echo $p1->name . "";  
// 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性  
unset($p1->name);  
// 已经被删除了, 所这行不会有输出  
echo $p1->name; 

class Person
{
 // 下面是人的成员属性
 private $name; // 人的名字
 private $sex; // 人的性别
 private $age; // 人的年龄
 //__get()方法用来获取私有属性
 private function __get($property_name)
 {
  if (isset($this->$property_name)) {
   return($this->$property_name);
  } else {
   return(NULL);
  }
 }
 // __set()方法用来设置私有属性
 private function __set($property_name, $value)
 {
  $this->$property_name = $value;
 }
 // __isset()方法
 private function __isset($nm)
 {
  echo "isset()函数测定私有成员时,自动调用";
  return isset($this->$nm);
 }
 // __unset()方法
 private function __unset($nm)
 {
  echo "当在类外部使用unset()函数来删除私有成员时自动调用的";
  unset($this->$nm);
 }
}
$p1 = new Person();
$p1->name = "this is a person name";
// 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
echo var_dump(isset($p1->name)) . "";
echo $p1->name . "";
// 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
unset($p1->name);
// 已经被删除了, 所这行不会有输出
echo $p1->name;输出结果为:

isset()函数测定私有成员时,自动调用  
bool(true)  
this is a person name 

isset()函数测定私有成员时,自动调用
bool(true)
this is a person name当在类外部使用unset()函数来删除私有成员时自动调用的 __set()、__get()、__isset()、__unset()

这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/629197.htmlTechArticle本文章简单的介绍一下关于PHP5面向对象详解 - (10) __set() __get() __isset() __unset()四个方法,有需要发解的朋友可以参考一下。 __set() __get() __i...
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

怎么在番茄免费小说app中写小说 分享番茄小说写小说方法教程 怎么在番茄免费小说app中写小说 分享番茄小说写小说方法教程 Mar 28, 2024 pm 12:50 PM

  番茄小说是一款非常热门的小说阅读软件,我们在番茄小说中经常会有新的小说和漫画可以去阅读,每一本小说和漫画都很有意思,很多小伙伴也想着要去写小说来赚取赚取零花钱,在把自己想要写的小说内容编辑成文字,那么我们要怎么样在这里面去写小说呢?小伙伴们都不知道,那就让我们一起到本站本站中花点时间来看写小说的方法介绍吧。分享番茄小说写小说方法教程  1、首先在手机上打开番茄免费小说app,点击个人中心——作家中心  2、跳转到番茄作家助手页面——点击创建新书在小说的结

微信删除的人如何找回(简单教程告诉你如何恢复被删除的联系人) 微信删除的人如何找回(简单教程告诉你如何恢复被删除的联系人) May 01, 2024 pm 12:01 PM

而后悔莫及、人们常常会因为一些原因不小心将某些联系人删除、微信作为一款广泛使用的社交软件。帮助用户解决这一问题,本文将介绍如何通过简单的方法找回被删除的联系人。1.了解微信联系人删除机制这为我们找回被删除的联系人提供了可能性、微信中的联系人删除机制是将其从通讯录中移除,但并未完全删除。2.使用微信内置“通讯录恢复”功能微信提供了“通讯录恢复”节省时间和精力,用户可以通过该功能快速找回之前被删除的联系人,功能。3.进入微信设置页面点击右下角,打开微信应用“我”再点击右上角设置图标、进入设置页面,,

手机版龙蛋孵化方法大揭秘(一步一步教你如何成功孵化手机版龙蛋) 手机版龙蛋孵化方法大揭秘(一步一步教你如何成功孵化手机版龙蛋) May 04, 2024 pm 06:01 PM

手机游戏成为了人们生活中不可或缺的一部分,随着科技的发展。它以其可爱的龙蛋形象和有趣的孵化过程吸引了众多玩家的关注,而其中一款备受瞩目的游戏就是手机版龙蛋。帮助玩家们在游戏中更好地培养和成长自己的小龙,本文将向大家介绍手机版龙蛋的孵化方法。1.选择合适的龙蛋种类玩家需要仔细选择自己喜欢并且适合自己的龙蛋种类,根据游戏中提供的不同种类的龙蛋属性和能力。2.提升孵化机的等级玩家需要通过完成任务和收集道具来提升孵化机的等级,孵化机的等级决定了孵化速度和孵化成功率。3.收集孵化所需的资源玩家需要在游戏中

快速掌握:华为手机开启两个微信账号方法大揭秘! 快速掌握:华为手机开启两个微信账号方法大揭秘! Mar 23, 2024 am 10:42 AM

在当今社会,手机已经成为我们生活中不可或缺的一部分。而微信作为我们日常沟通、工作、生活的重要工具,更是经常被使用。然而,在处理不同事务时可能需要分开两个微信账号,这就要求手机能够支持同时登录两个微信账号。华为手机作为国内知名品牌,很多人使用,那么华为手机开启两个微信账号的方法是怎样的呢?下面就来揭秘一下这个方法。首先,要在华为手机上同时使用两个微信账号,最简

手机字体大小设置方法(轻松调整手机字体大小) 手机字体大小设置方法(轻松调整手机字体大小) May 07, 2024 pm 03:34 PM

字体大小的设置成为了一项重要的个性化需求,随着手机成为人们日常生活的重要工具。以满足不同用户的需求、本文将介绍如何通过简单的操作,提升手机使用体验,调整手机字体大小。为什么需要调整手机字体大小-调整字体大小可以使文字更清晰易读-适合不同年龄段用户的阅读需求-方便视力不佳的用户使用手机系统自带字体大小设置功能-如何进入系统设置界面-在设置界面中找到并进入"显示"选项-找到"字体大小"选项并进行调整第三方应用调整字体大小-下载并安装支持字体大小调整的应用程序-打开应用程序并进入相关设置界面-根据个人

Go语言方法与函数的区别及应用场景解析 Go语言方法与函数的区别及应用场景解析 Apr 04, 2024 am 09:24 AM

Go语言方法与函数的区别在于与结构体的关联性:方法与结构体关联,用于操作结构体数据或方法;函数独立于类型,用于执行通用操作。

如何选择手机膜,保护你的手机屏幕(选购手机膜的几大要点与技巧) 如何选择手机膜,保护你的手机屏幕(选购手机膜的几大要点与技巧) May 07, 2024 pm 05:55 PM

手机膜成为了必不可少的配件之一,随着智能手机的普及。延长其使用寿命,选择一款合适的手机膜可以保护手机屏幕。帮助读者选出最适合自己的手机膜、本文将介绍选购手机膜的几大要点与技巧。了解手机膜的材质及类型PET膜,TPU等、手机膜有多种材质,包括钢化玻璃。PET膜较为柔软、钢化玻璃膜具有较好的耐刮花性能,TPU则具有较好的防震性能。可以根据个人偏好及需求来决定,在选择时。考虑屏幕的保护程度不同类型的手机膜对屏幕的保护程度不同。PET膜则主要起到防刮花作用,钢化玻璃膜具有较好的耐摔性能。可以选择具有较好

如何将 MySQL 查询结果数组转换为对象? 如何将 MySQL 查询结果数组转换为对象? Apr 29, 2024 pm 01:09 PM

将MySQL查询结果数组转换为对象的方法如下:创建一个空对象数组。循环结果数组并为每一行创建一个新的对象。使用foreach循环将每一行的键值对赋给新对象的相应属性。将新对象添加到对象数组中。关闭数据库连接。

See all articles