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 相关文章推荐
php4的session功能评述(一)
Oct 09 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
Ajax PHP简单入门教程代码
Apr 25 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
php expects parameter 1 to be resource, array given 错误
Mar 23 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
PHP 函数call_user_func和call_user_func_array用法详解
Mar 02 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
PHP反射机制用法实例
Aug 28 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
php实现微信支付之企业付款
May 30 PHP
laravel入门知识点整理
Sep 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魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
Angular6 写一个简单的Select组件示例
2018/08/20 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
通过源码分析Python中的切片赋值
2017/05/08 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python区块及区块链的开发详解
2019/07/03 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
keras.layer.input()用法说明
2020/06/16 Python
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
轻金属冶金专业毕业生自荐信
2013/11/02 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
大学开学计划书
2014/04/30 职场文书
赔偿协议书
2015/01/27 职场文书
煤矿安全保证书
2015/02/27 职场文书
新手初学Java List 接口
2021/07/07 Java/Android
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers