详解php的魔术方法__get()和__set()使用介绍


Posted in PHP onSeptember 19, 2012

先看看php官方文档的解释:
__set() is run when writing data to inaccessible properties.
__get() is utilized for reading data from inaccessible properties.

究竟用中文怎么翻译呢?
inaccessible :n. 难达到;难接近;无法理解。

有代码有真相:

<?php 
error_reporting(E_ALL); 
class stu{ 
private $a; 
private $b = 0; 
public $c; 
public $d = 0; 
//这里的 private 可以用 protected public 替代 
private function __get($name) { 
return 123; 
} //这里的 private 也可以用 protected public 替代 
private function __set($name, $value) { 
echo "This is set function"; 
} 
} 
$s = new stu(); 
var_dump($s->a); //output: 123 
var_dump($s->b); //output: 123 
var_dump($s->c); //output: null 
var_dump($s->d); //output: 0 
var_dump($s->e); //output: 123 
$s->a = 3; //output: This is set function 
$s->c = 3; //no output 
$s->f = 3; //output: This is set function 
?>

结果分析:
如果没有__get方法,执行 var_dump($s->a) var_dump($s->b) 会有致命的错误
如果没有__get方法,执行 var_dump($s->e) 会有一个notice,提示没有定义属性 $e

总结:
1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性
4. __isset() __unset() 也类似

PHP 相关文章推荐
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
php session劫持和防范的方法
Nov 12 PHP
Drupal读取Excel并导入数据库实例
Mar 02 PHP
PHP中mysqli_affected_rows作用行数返回值分析
Dec 26 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
Oct 18 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
PHP htmlspecialchars_decode()函数用法讲解
Mar 01 PHP
php引用计数器进行垃圾收集机制介绍
Sep 19 #PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 #PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 #PHP
PHP输入流php://input介绍
Sep 18 #PHP
PHP爆绝对路径方法收集整理
Sep 17 #PHP
php中inlcude()性能对比详解
Sep 16 #PHP
微博短链接算法php版本实现代码
Sep 15 #PHP
You might like
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
Yii中表单用法实例详解
2016/01/05 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
让焦点自动跳转
2006/07/01 Javascript
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
Python多线程原理与用法实例剖析
2019/01/22 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
小学生综合素质评语
2014/04/23 职场文书
心理咨询承诺书
2014/05/20 职场文书
消费者投诉书范文
2015/07/02 职场文书