Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP语言教程-魔术方法之属性重载和方法重载

PHP语言教程-魔术方法之属性重载和方法重载

作者头像
frank.
发布于 2019-11-26 10:14:01
发布于 2019-11-26 10:14:01
65000
代码可运行
举报
运行总次数:0
代码可运行

PHP魔术方法是以 __ 两个下划线开头的方法,具有魔术功能的一些方法,本文主要讲实现属性重载和方法重载的魔术方法。

属性重载

__set()魔术方法 __get()魔术方法 示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class User {
    private $name;
    private $age;
}
// 实例化User类
$user = new User();
// 调用类的私有属性
echo $user->name;

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHP Fatal error:  Uncaught Error: Cannot access private property User::$name in /Users/frankphper/www/php/magic/demo1.php:9

示例中我们调用了私有属性,程序运行时报了一个致命错误,大致意思是说不能访问私有属性name 我们在以上示例代码中的类定义代码里面增加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 属性重载
public function __set($name, $value) {
    echo "Setting $name to $value" . PHP_EOL;
    $this->$name = $value;
}
public function __get($name) {
    if (!isset($this->$name)) {
        echo '未设置' . PHP_EOL;
        // 设置默认值
        $this->$name = 'guest' . PHP_EOL;
    }
    return $this->$name;
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
未设置
guest

代码讲解: 我们在代码中增加了__set()和__get()两个魔术方法,再次运行代码,输出正常,没有报错。 当我们试图写入一个不存在或不可见的属性时,PHP就会执行对象(类)中的__set()魔术方法,方法必须接收两个参数,用来存放属性名和属性值。当我们试图读取一个不存在或者不可见的属性时,PHP就会执行对象(类)中的__get()魔术方法。

__set()和__get()作用:

1、直接在对象(类)的外部调用对象(类)的私有属性是会报错的,但是如果对象(类)中定义了__set()魔术方法,就可以很方便的调用对象(类)的私有属性,因为魔术方法是自动调用的,不需要显式地调用。 2、动态创建对象(类)的属性,如果对象(类)中定义了__set()和__get()魔术方法,那么当调用对象属性取值时,即使这个属性不存在,也不会报错,从而提升了程序的健壮性。

方法重载

__call()魔术方法

__callStatic()魔术方法

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
class User {
    private $name;
    private $age;
}
// 实例化User类
$user = new User();
// 调用类中不存在的方法
$userInfo = $user->userInfo('lucy', 18);

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHP Fatal error:  Uncaught Error: Call to undefined method User::userInfo() in /Users/frankphper/www/php/magic/test.php:9

示例中我们调用了不存在的方法,程序报了一个致命错误,大致意思是不能访问未定义的方法userInfo()我们在以上示例代码中的类定义代码里面增加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 方法重载
public function __call($methodName, $params) {
    echo '方法名:' . $methodName . PHP_EOL;
    print_r($params);
}
static function __callStatic($methodName, $params) {
    echo '方法名:' . $methodName . PHP_EOL;
    print_r($params);
}

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
方法名:userInfo
Array
(
    [0] => lucy
    [1] => 18
)

代码讲解: 我们在代码中增加了__call()魔术方法,再次运行程序,输出正常,没有报错。当我们试图调用对象(类)中一个不存在或者不可见的方法时,PHP会执行对象(类)中的_call()魔术方法。__call()也必须接收两个参数,用来存放试图调用的方法名和要传递给该方法的参数。如果我们试图调用对象(类)中一个不存在或者不可见的静态方法时,PHP会执行对象(类)中的__callStatic()魔术方法。

__call()和__callStatic()作用:

1、防止调用不存在或者不可见的方法而报错 2、动态创建对象(类)的方法

总结

我们通过示例代码讲解了属性重载和方法重载的PHP魔术方法,在实际开发工作中,可以灵活使用这些魔术方法的特性,优雅地处理各种场景。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 cnSwift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP中的那些魔术方法(一)
在PHP中,有一堆魔术方法,服务于类和对象。PHP虽然也是纯种的面向对象语言,但是之前的PHP还真不是,所以有一些面向对象的标准实现并不完善,比如重载。但是,我们可以通过一些魔术方法来弥补,例如__call()方法就可以用来实现重载。
硬核项目经理
2019/08/06
1K0
PHP 魔术方法、序列化与对象复制
__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、 __wakeup()、__toString()、__invoke()、__set_state()、__clone() 和 __debugInfo()。
学院君
2020/07/21
1.9K0
PHP 魔术方法、序列化与对象复制
PHP中的“重载”是个啥?
很多面试官在面试的时候都会问一些面向对象的问题,面向对象的三大特性中,多态最主要的实现方式就是方法的重载和重写。但是在PHP中,只有重写,并没有完全的重载能力的实现。
硬核项目经理
2020/03/16
7290
Laravel5.2之PHP重载(overloading)
说明:本文主要讲述PHP中重载概念,由于Laravel框架中经常使用这块知识点,并且PHP的重载概念又与其他OOP语言如JAVA中重载概念不一样,故复习并记录相关知识点。同时,作者会将开发过程中的一些截图和代码黏上去,提高阅读效率。
botkenni
2022/01/10
3.2K0
PHP-魔术方法
1.6 魔术方法 已经学习的魔术方法 __construct() __destruct() __clone() 1.6.1 __tostring()、__invoke() __tostring():
cwl_java
2022/11/30
3560
PHP5中的魔术方法
php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。
用户7657330
2020/08/14
2.7K0
PHP之十六个魔术方法详解
PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:
botkenni
2022/03/24
1.5K0
PHP重载,不一样的重载
PHP所提供的重载(overloading)是指动态地创建类属性和方法。我们是通过魔术方法(magic methods)来实现的。
joshua317
2021/11/01
1.3K0
PHP重载,不一样的重载
PHP类,魔术方法
析构函数,当类被手动销毁,或者脚本结束时,gc回收触发。可以执行一些后置操作,比如删除临时目录下的文件。
宣言言言
2019/12/19
9290
PHP的魔术方法--上
魔术方法是反序列化的基础,而且在CTF中,序列化题目,你说我有什么理由不学习反序列化呢!!! ![1](https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=3296012127,32476798&fm=26&gp=0.jpg) 魔术方法是在php中,以两条下划线开头的函数称为魔术方法!!! 学习反序列化的前提就是要对常见的魔术方法有一个了解,魔术方法目前包括16个:
vFREE
2021/12/20
1.5K1
PHP.步步为营 | 类与面向对象 知识详析 与 运用实例
关于类的知识我们可以类比Java的语法去记忆, 类对象通过new关键字进行实例化, 实例化的对象通过-> 调用类成员;
凌川江雪
2019/03/15
1.1K0
PHP的那些魔术方法(二)
上文中介绍了非常常用并且也是面试时的热门魔术方法,而这篇文章中的所介绍的或许并不是那么常用,但绝对是加分项。当你能准确地说出这些方法及作用的时候,相信对方更能对你刮目相看。
硬核项目经理
2019/08/06
4360
PHP 面向对象知识点
定义基本的类: 在类中我们可以定义各种数据成员和成员函数,其中public修饰的函数与变量可以在任何地方被调用,而private修饰的函数只能在本类中被调用子类不可调用,而protected修饰的则可以在本类和子类中被调用但不可以在外部调用.
王瑞MVP
2022/12/28
7690
php学习之类与对象的魔术方法的使用
访问protected,private不可以直接访问,解决方法是编写一个public的成员方法,来操作protected和private属性
吾爱乐享
2019/12/30
6360
php学习之类与对象的魔术方法的使用
了解PHP魔术方法:__toString()、__invoke()和__debugInfo()
最近同事在研究内部开发的组件时,发现了一个__debugInfo()的用法,突然问我,我一时也没有想起这是个什么用法,于是重新阅读下 PHP 手册。
沈唁
2024/04/15
4330
了解PHP魔术方法:__toString()、__invoke()和__debugInfo()
PHP中的12个魔术方法
这个标题有点牵强因为php有不只12种魔术方法, 但是这些将会引导你使用php魔术方法一个好的开始。它可能魔幻,但是并不需要魔杖。
Enjoy233
2019/03/05
9510
PHP7-2: 面向对象开发
以上是PHP7的 基础语法,通过本章的学习,可以对PHP有大体的认识。本章有的语法没有介绍到,学习过其他语言的话,很快会上手的。
程序员海军
2021/10/11
5590
PHP7-2: 面向对象开发
php面试笔记(9)-php基础知识-面向对象考点
01 回顾真题 请写出 PHP 类权限控制修饰符 答案: public:公有类型 在类、子类、外部都可以访问 protected:受保护类型 在类、子类可以访问 private:私有类型 只要在子类可以访问 02 考点分析 02-1面向对象内容本考点主要是考察php中类中的权限控制修饰符,以及面及向对象的特性、魔术方法、设计模式等考点1继承 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为
学长冷月
2020/08/02
4530
PHP核心技术与最佳实践 读书笔记 第一章面向对象思想的核心概念
面向对象程序设计是一种程序设计范型,同时也是一种程序开发方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和可扩展性。
lilugirl
2019/05/26
1.2K0
PHP 中的魔术方法
1. 什么是魔术方法 ? PHP 魔术方法 官方文档 传送门 PHP 的魔术方法是指 PHP 中以两个下划线 _ 开头的类方法 我们自己在定义类方法时不能使用魔术方法的名称,除非是想使用其魔术功能 2
很酷的站长
2022/12/19
5100
PHP 中的魔术方法
相关推荐
PHP中的那些魔术方法(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验