PHP中__get()和__set()的用法实例详解


Posted in PHP onJune 04, 2013

php面向对象_get(),_set()的用法
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性。类似于java中的javabean的操作,使用的方法也类似,只是不需要像javabean中那样,对每个字段进行set和get的操作。只需要加上两个魔术方法即可。即私有成员的设值和取值的操作。在PHP5中给我们提供了专门为属性设置值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加:

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

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

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

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

程序执行结果:
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值
在直接获取私有属性值的时候,自动调用了这个__get()方法
姓名:张三
在直接获取私有属性值的时候,自动调用了这个__get()方法
性别:男
在直接获取私有属性值的时候,自动调用了这个__get()方法
年龄:20
以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。
PHP 相关文章推荐
第十一节--重载
Nov 16 PHP
PHP生成静态页面详解
Nov 19 PHP
织梦模板标记简介
Mar 11 PHP
网友原创的PHP模板类代码
Sep 07 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
解析数组非数字键名引号的必要性
Aug 09 PHP
php获取网页请求状态程序示例
Jun 17 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
php 后端实现JWT认证方法示例
Sep 04 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
深入PHP运行环境配置的详解
Jun 04 #PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 #PHP
如何设置mysql允许外网访问
Jun 04 #PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 #PHP
PHP多线程批量采集下载美女图片的实现代码(续)
Jun 03 #PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 #PHP
php变量作用域的深入解析
Jun 03 #PHP
You might like
php自定义函数call_user_func和call_user_func_array详解
2011/07/14 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
基于javascript滚动图片具体实现
2013/11/18 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
2018/01/22 jQuery
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
React diff算法的实现示例
2018/04/20 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
python实现逻辑回归的方法示例
2017/05/02 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
python3学生名片管理v2.0版
2018/11/29 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
Python PIL库图片灰化处理
2020/04/07 Python
通过实例解析Python RPC实现原理及方法
2020/07/07 Python
Python基于httpx模块实现发送请求
2020/07/07 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
个人自我评价分享
2013/12/20 职场文书
校园安全教育广播稿
2014/02/17 职场文书
通用自荐信范文
2014/03/14 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2014年创卫工作总结
2014/11/24 职场文书
五年级上册复习计划
2015/01/19 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
MySQL数据库简介与基本操作
2022/05/30 MySQL