PHP中的__get和__set理解
先来了解一下PHP类中的__get和__set函数
当我们试图获取一个不可达属性时(比如private),类会自动调用__get函数。
当试图设置一个不可达属性时(比如private),类会自动调用__set函数,我们一起来看个例子:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
}
$class = new Person();
echo $class->sex;
这里$sex声明了私用变量,私有变量或方法在类实例化是不能直接访问的,所以上面会抛出异常
Fatal error: Uncaught Error: Cannot access private property Person::$sex
我们再稍加改造一下:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __get($name){
echo '个人信息:'.$name.$this->sex;
}
}
$class = new Person();
echo $class->sex;//个人信息:sex男
可以看出sex方法自动调用了,并可以访问私有变量。
我们再来看一下__set函数,同样也是先使用可达的私有属性:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __set($name, $val){
echo '个人信息:'.$name. $val;
}
}
$class = new Person();
$class->sex = '女';
echo $class->sex;
个人信息:sex女
( ! ) Fatal error: Uncaught Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line
( ! ) Error: Cannot access private property Person::$sex in G:\web\gitlearn\set.php on line
这里调用了__set函数并提示我们不能使用类的私有属性。可以看到sex在外部是被改变 了,但是抛出了致命错误
现在我们来通过__set函数实现外部使用私有属性:
<?php
class Person{
public $name = '周伯通';
private $sex = '男';
function __set($name, $val){
//echo '个人信息:'.$this->$name = $val;
$this->$name = $val; //注意 这里是$name,是要设置访问的变量名,如果大家用$this->name,会看到本例会输出的是 男
}
function getSex(){
echo $this->sex; //获取新的属性
}
}
$class = new Person();
$class->sex = '女';
echo $class->getSex();// 输出 女
通过上面几个例子,相信大家对set/get应该有更深的理解啦。
PHP中的__get和__set理解的更多相关文章
- PHP类中的__get()和__set函数到底有什么用
PHP类中的__get()和__set函数到底有什么用 一.总结 一句话总结:当试图获取一个不可达变量时,类会自动调用__get.同样的,当试图设置一个不可达变量时,类会自动调用__set.在网站中, ...
- php 魔术方法__get()和__set()理解
__get()方法,官方手册上是这样解释的 : ' 当调用(自己加的:或设置|赋值)当前环境下未定义或不可见的类属性或方法时,重载方法会被调用.本节后面将使用"不可访问属性(inaccess ...
- PHP类中的__get()和__set函数到底有什么用?
当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数. 例如: Class Test { ...
- PHP中的__get()和__set()方法获取设置私有属性
在类的封装中,获取属性可以自定义getXXX()和setXXX()方法,当一个类中有多个属性时,使用这种方式就会很麻烦.为此PHP5中预定义了__get()和__set()方法,其中__get()方法 ...
- php中的__get和__set方法
1.__get() 作用:当实例化对象调用一个没有定义的属性时,会自动调用__get()方法 当实例化对象调用一个私有或者受保护的属性时,也会调用这个方法,方式类似 结果是:你访问的公开属性:name ...
- PHP中__get()和__set()的用法实例详解
php面向对象_get(),_set()的用法 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__ge ...
- PHP5中__call、__get、__set、__clone、__sleep、__wakeup的用法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__w ...
- php中__get()和__set的用法
php版本5.6 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来 ...
- PHP中__get()和__set()的用法实例详
刚刚看到一个对我有用的文章,我就把它摘抄下来了. php面 ...
随机推荐
- dedecms 文章根据 权重排序
原文链接 一: dede:list 标签 找到 /include/arc.listview.class.php if($orderby=="senddate" || $orde ...
- swust oj 986
哈夫曼译码 1000(ms) 10000(kb) 1997 / 4186 通常要求根据给定的编码本对密文进行解码.现已给定相应字符的哈夫曼编码,要求根据编码对密文进行解码.(建立哈夫曼树以及编码.主函 ...
- 2019PHP面试题最全面归纳总结
1.请选择以下代码运行的结果: <?php if ('1e3' == '1000') echo 'LOL'; ?> A 无任何输出结果 B LOL C 不执行且报错 解析:1e3 ...
- ThinkPHP5 打开多语言支持
1.在thinkphp\start.php 页面中添加多语言的切换函数的参数格式,本贴目前只支持两种语言,并注意必须全部小写!全部小写!!全部小写!!!,注意这一步很关键 Lang::setAllow ...
- ASP.NET Core Web App应用第三方Bootstrap模板
引言 作为后端开发来说,前端表示玩不转,我们一般会选择套用一些开源的Bootstrap 模板主题来进行前端设计.那如何套用呢?今天就简单创建一个ASP.NET Core Web MVC 模板项目为例, ...
- FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg
一.简述 ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑.有了它,我们就可以对媒体文件做很多我们想做的 ...
- 使用MUI的日期控件引起的探索——HTML5 input类型date属性
我写移动端的页面会用到MUI这个框架,个人觉得挺好用的,有很多实用的UI组件.当然坑还是有的,http://dev.dcloud.net.cn/mui/ui/ MUI官网,有兴趣的小伙伴可以看看 虽然 ...
- [Swift]LeetCode145. 二叉树的后序遍历 | Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,null,2, ...
- [Swift]LeetCode875. 爱吃香蕉的珂珂 | Koko Eating Bananas
Koko loves to eat bananas. There are N piles of bananas, the i-th pile has piles[i]bananas. The gu ...
- Spring Boot Security
如图,是一种通用的用户权限模型.一般情况下会有5张表,分别是:用户表,角色表,权限表,用户角色关系表,角色权限对应表. 一般,资源分配时是基于角色的(即,资源访问权限赋给角色,用户通过角色进而拥有权限 ...