详解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 相关文章推荐
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
解析PHP中$_FILES的使用以及注意事项
Jul 05 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP实现验证码校验功能
Nov 16 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
thinkphp5实现无限级分类
Feb 18 PHP
php如何获取Http请求
Apr 30 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
PHP的加密方式及原理
2012/06/14 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
jQuery实现日历效果
2020/09/11 jQuery
react的hooks的用法详解
2020/10/12 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Python异常的检测和处理方法
2018/10/26 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
美术毕业生求职信
2014/02/25 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL