1、魔术方法:

/**
* @purpose: 魔术方法 __get() , __set(), __isset(), __call, __callStatic, __toString, __invoke 的使用
* User: daicr
* Date: 2019/3/4
* Time: 11:10
*
* 1、当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用
*
* 2、当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用
*
* 3、当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行
*
* 4、当所调用对象的方法不存在时默认调用 __call
*
* 5、当所调用对象的静态方法不存在时默认调用 __callStatic
*
* 6、当一个类或者对象被当做字符串返回时,会调用 __toString 来输出
*
* 7、当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
*/
class Test
{
/**
* @var string 私有属性,外部方法访问不了,会默认调用 __get
*/
private $username = 'daicr'; /**
* @var array 存放对象的属性数组
*/
protected $attributes = []; /**
* @purpose: 当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用
* @param string $name 属性名
* @return mixed
*/
public function __get($name)
{
if(array_key_exists($name,$this->attributes)){
return $this->attributes[$name];
}
} /**
* @purpose: 当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用
* @param string $name 属性名
* @param mixed $value 属性值
*/
public function __set($name, $value)
{
if(property_exists($this,$name)){
$this->$name = $value;
}else{
$this->attributes[$name] = $value;
}
} /**
* @purpose: 当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行
* @param string $name 属性名
* @return bool
*/
public function __isset($name)
{
if(isset($this->attributes[$name])){
return true;
}
} /**
* @purpose: 当所调用对象的方法不存在时默认调用 __call
* @param string $name 方法名
* @param mixed $arguments 参数
*/
public function __call($name, $arguments)
{
// 注意: $name 的值区分大小写
echo "对象方法名: '$name' , 参数:" . implode(', ', $arguments). "\n";
}
/**
* @purpose: 当所调用对象的静态方法不存在时默认调用 __callStatic
* @param string $name 方法名
* @param mixed $arguments 参数
*/
public static function __callStatic($name, $arguments)
{
// 注意: $name 的值区分大小写
echo "对象静态方法名: '$name' " . implode(', ', $arguments). "\n";
} /**
* @purpose: 当一个类或者对象被当做字符串返回时,会调用 __toString 来输出
* @return string
*/
public function __toString()
{
return __CLASS__;
} /**
* @purpose: 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
*/
public function __invoke()
{
echo 'invoke';
} /**
* @purpose: 打印对象属性数组
*/
public function index(){
var_dump($this->attributes);
}
}

2、调用魔术方法(在另外一个类的方法里面)

public function index()
{
$testModel = new Test(); // 访问一个私有属性,如果没有__get(),是会报错的。过程:$testModel->username--没有权限-->__get('username');
echo $testModel->username; //$testModel没有age属性,但是会通过__set()进行赋值
$testModel->age=26;
$testModel->index(); //array(1) { ["age"]=> int(26) } echo $testModel->test('hello'); //"对象方法名: 'test' , 参数:hello echo $testModel::test( ['hello','world']); //"对象静态方法名:'test' , 参数:hello //直接输出对象的时候,会输出对象名的字符串形式. 输出值为: Test
echo $testModel; //把类当做方法来使用,会调用__invoke , 输出值为:invoke.
echo $testModel();
}

此文章为小代在工作中的总结,如有转载请注明出处https://www.cnblogs.com/chrdai/

php魔术方法__get(),__set(),__isset()的使用的更多相关文章

  1. PHP 魔术方法 __get __set (二)

    慢慢长寻夜,明月高空挂 __get() - 读取不可访问属性的值时,__get() 会被调用 __set() - 在给不可访问属性赋值时,__set() 会被调用 <?php /** * 清晰的 ...

  2. [PHP] 魔术方法__get __set __sleep __wakeup的实际使用

    1.__get __set是在给不可访问属性赋值和读取时,调用 2.__sleep 是在序列化对象的时候调用 3.__wakeup是在反序列化对象的时候调用 4.可以在序列化对象的时候 , 只序列化指 ...

  3. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  4. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  5. __get(),__set(),__isset(),__unset()

    __get(),__set(),__isset(),__unset() 在给不可访问属性赋值时,__set()会被调用读取不可访问属性的值时,__get()会被调用 当对不可访问属性调用isset() ...

  6. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  7. __get().__set.__isset,__unset魔术方法

    一般来说,总是把类的属性定义为 private .这更符合现实的逻辑. 但是对属性的读取和赋值操作非常频繁的,因此在PHP中,预定义了两魔术方法 "__get()"用来获取私有成员属性值的,只有一个参 ...

  8. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  9. PHP常用魔术方法(__set、__get魔术方法:)

    __set.__get魔术方法: //文件名:Object.php <?phpnamespace IMooc;class Object{ protected $array = array(); ...

随机推荐

  1. 微信小程序常见的坑

    wxml的标签跟html里面的一些标签是一样的,比如view标签相当于div标签,text标签相当于span标签. 在微信小程序中,表单元素都是原生组件,微信小程序中原生组件层级最高,所以在用inpu ...

  2. 干掉windows无脑设定:“始终使用选择的程序打开这种文件”、“使用Web服务查找正确的程序”

    先看几张图体会一下: 实在很佩服自己就那样默默忍受了很多很多年.其实这些东西在网上小小的一搜,5分钟就能搞定. 然而我们大家都在想,现在没时间,我还要做xxxx事呢,反正多点两下鼠标而已. 是啊,点两 ...

  3. LeetCode第二十三题-合并n个有序链表

    Merge k Sorted Lists 问题简介:合并k个已排序的链表并将其作为一个排序链表返回. 举例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  4. GDOI2019游记

    只是提前开坑啊,CCF不要禁我赛啊QwQ 虽然才初三,不能进省队,但还是要拼一把,至少不能垫底吧. NTF和CDW两位初二巨佬都在四川省选拿了非正式选手Rank3,4,我还有什么理由去摸鱼? Day\ ...

  5. linux常用命令使用方法

    一.常用的分析服务器日志命令 1.查看有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc -l 2.查看某一个页面被访问的次数: grep "/ ...

  6. Robot Framework学习笔记

    robot framework 上个用例的输出作为下个用例的输入 (Set Global Variable的用法) 注意:如果直接在suite里定义变量,变量在suite里的用例里只能应用,修改的效果 ...

  7. 怎么给PDF去除页眉页脚

    PDF文件我们现在都会使用到,但有时需编辑PDF文件的时候,小伙伴们都知道该怎么操作吗,不知道的小伙伴不用担心,今天小编就来跟大家分享一下怎么删除PDF文件的页眉页脚,我们一起来看看下面的文章吧 操作 ...

  8. 关于父窗口获取跨域iframe子窗口中的元素

    这几天在项目中遇到,一个难点, 就是需要异步加载一个pdf插件, 同时又需要获取这个插件中的点击事件来生成用户的下载记录. 刚开始也是想了很多方法,网上搜的 格式1:$("#iframe的I ...

  9. iOS开发之获取当前展示的VC

    /** 递归查找当前显示的VC*/ + (UIViewController *)recursiveFindCurrentShowViewControllerFromViewController:(UI ...

  10. Jmeter组成结构及运行原理

    Jmeter结构主要组成要素包括:测试计划,线程组,采样器以及监听器.对于各部件的作用域关系如下图: Jmeter是纯Java程序,使用JVM,运行采用多线程完成,往往单台负载机由于机器配置有限,支持 ...