0

0

PHP魔术方法之__get,__set详解(代码实例)

易达

易达

发布时间:2020-05-27 22:27:24

|

4527人浏览过

|

来源于php中文网

原创

本文目标:

1、了解PHP中魔术方法的定义

2、了解__get()魔术方法的使用场景

3、掌握__get()魔术方法的用法

4、了解__set()魔术方法的使用场景

5、掌握__set()魔术方法的用法

(一)、了解PHP中魔术方法的定义

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。

这2个魔术方法,还有个叫法,还可以称作属性重载的魔术方法

(二)、了解__get()魔术方法的使用场景

当希望访问某个对象的未定义的或者不可访问的属性不报错,我们可以在类里定义__get方法,这样系统在此刻会自动调用该方法

(三)、掌握__get()魔术方法的用法

总结:

1、PHP中__get的定义格式如下:public function __get(参数1) ,这里注意必须是2个__,名称必须是__get,而且必须是要带1个参数,多一个少一个都不行

立即学习PHP免费学习笔记(深入)”;

2、当调用不存在的属性时,系统会自动触发对象所在类的定义好的__get方法

每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观

案例一、

实践目标:

1、PHP中__get的定义格式如下:public function __get(参数1) ,这里注意必须是2个__,名称必须是__get,而且必须是要带1个参数,多一个少一个都不行

立即学习PHP免费学习笔记(深入)”;

具体代码如下:

";
    // }
    //魔术方法  
    public  function __get($name){
        echo "自动执行了Animal类中的__get方法,当前属性为:{$name}
"; } } $ani = new Animal(); ?>

运行结果为:

未报错,说明语法正确

现在我们 多加个参数看下

";
    // }
    //魔术方法  
    public  function __get($name,$arg){
        echo "自动执行了Animal类中的__get方法,当前属性为:{$name}
"; } } $ani = new Animal(); $name = $ani->name; ?>

运行结果为:

Fatal error: Method Animal::__get() must take exactly 1 argument in D:\E-class\class-code\classing\index.php on line 14

所以从结果可以看出,参数有且只能有一个,多一个少一个都不行

案例二、

实践目标:

1、当调用不存在的属性时,系统会自动触发对象所在类的定义好的__get方法

具体代码如下:

";
    // }
    //魔术方法  
    public  function __get($name){
        echo "自动执行了Animal类中的__get方法,当前属性为:{$name}
"; } } $ani = new Animal(); $name = $ani->name; ?>

运行结果如下:

自动执行了Animal类中的__get方法,当前属性为:name

《PHP技术内幕》中文版
《PHP技术内幕》中文版

本书详细说明了PHP的使用方法,内容涉及PHP应用的各个方面,并提供了大量的代码实例,使读者能够快速而容易地学会PHP。每一章都分为两部分,前一部分“深入分析”详细说明相关的技术信息,

下载

我们发现其实我们没有手动的去调用__get方法,就是说没有写成$ani->__get(),但是这个方法依然执行了,因为什么呢?因为我们写了$ani->name;而这个name方法没有在类中定义,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了,而且我们__get中的参数就是这个属性

这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试

";
    // }
    //魔术方法  试着少写一个_
    public  function _get($name){
        echo "自动执行了Animal类中的__get方法,当前属性为:{$name}
"; } } $ani = new Animal(); $name = $ani->name; ?>

运行结果如下:

Notice: Undefined property: Animal::$name in D:\E-class\class-code\classing\index.php on line 18

所以此刻就会报错了,因为没有__get的魔术方法了,所以一定要注意是2个下划线,就好像构造函数和析构函数一样,都是两个下划线

(四)、了解__set()魔术方法的使用场景

当为对象不存在的属性赋值时,会自动调用类中定义好的__set方法

(五)、掌握__set()魔术方法的用法

总结:

1、PHP中__set在类中定义格式如下  public function __set(属性参数1,属性对应的值的参数2),这里注意必须是2个__,名称必须是__set,而且必须是要带2个参数,多一个少一个都不行

2、当设置不存在的属性时,系统会自动触发对象所在类的定义好的__set方法

每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观

案例一、

实践目标:

1、PHP中__set在类中定义格式如下  public function __set(属性参数1,属性对应的值的参数2),这里注意必须是2个__,名称必须是__set,而且必须是要带2个参数,多一个少一个都不行

具体代码如下:

";
    }
}
$ani = new Animal();

?>

运行结果为:

空白,说明没有报错

接下来,我们少一个参数看下

";
    }
}
$ani = new Animal();

?>

运行结果为:

Fatal error: Method Animal::__set() must take exactly 2 arguments in D:\E-class\class-code\classing\index.php on line 11

所以__set方法的参数有且只能是2个,一个是属性名,一个是属性要设置的值

案例二、

实践目标:

1、当设置不存在的属性时,系统会自动触发对象所在类的定义好的__set方法

具体代码如下:

";
    }
}
$ani = new Animal();
$ani->name = "小狗";

?>

运行结果为:

自动执行了Animal类中的__set方法,当前属性为:name,值为:小狗

我们发现其实我们没有手动的去调用__set方法,也就是说没有写成$ani->__set(),但是这个方法依然执行了,因为什么呢?因为我们写了$ani->name = "小狗";;这个name属性在类中没有定义,然后这个类中又定义了这个魔术方法,所以它就像魔术一样,突然就被自动执行了

这里一定要注意,是2个下划线,不是一个,否则就不是魔术方法了,下面还是再来做下测试

具体代码如下:

";
    }
}
$ani = new Animal();
$ani->name = "小狗";

?>

运行结果如下:

空白了

所以说明没有执行__set魔术方法了,所以一定要记得是两个__

(六)、总结

1、本文主要讲了另外2个魔术方法,__get,__set,讲了他们的使用场景以及具体的实现

希望本文能给大家带来一定的帮助,谢谢!!!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号