0

0

五分钟带你了解PHP中的魔术方法(实例详解)

WBOY

WBOY

发布时间:2021-10-25 17:53:20

|

4321人浏览过

|

来源于php中文网

原创

在之前的文章中给大家带来了《php中clone关键字和__clone()方法的使用(实例详解)》,其中给大家详细的介绍了php中的clone关键字和__clone()方法,本篇文章继续给大家带来php中的魔术方法,希望对大家有帮助!

五分钟带你了解PHP中的魔术方法(实例详解)

在我们之前的文章中,我们介绍__clone()方法的时候提到,这是魔术方法的一种,《带你分清类中的构造函数与析构函数》中也提到的构造函数与析构函数也叫作构造方法与析构方法,他们也是魔术方法的一种。那么什么是魔术方法?它有哪些常用的方法?它又是怎样使用的?接下来我们一起来看一看吧。

PHP魔术方法

在PHP面向对象编程中,PHP里有一系列的魔术方法,这些魔术方法看看之前学习的__clone\__construct\__destruct我们能发现一个共同点,那就是它们都是由__两个下划线开始的,并且都是在某种特定的条件下自动调用的。

那接下来我们来看一看一些常用的魔术方法,结合实例来看一下它们的使用方法。

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

<strong><span style="font-size: 18px;">__set()</span></strong>方法

__set()方法用于在为当前环境下未定义或不可见的类属性赋值时,需要注意的是所有的魔术方法,都是在某种特定条件下自动调用的,为当前环境下未定义或不可见的类属性赋值时就是__set()方法调用的特定条件。

语法格式如下:

public function __set(要操作的变量, 要操作变量的值){
    ... ... ;
}

实例如下:

<?php
    class father{
        public $study1;
        private $study2;
        public function __set($key, $value){
            echo '为“'.$key.'”赋值“'.$value.'”失败!<br>';
        }
    }
    $object          = new father();
    $object -> study1  = '好好学习';
    $object -> study2   = '天天向上';
    $object -> study3 = '福如东海';
?>

    输出结果:

1025.11.png

由上述实例看出,当当前环境下未定义或不可见的类属性赋值时,就会调用__set()方法。

<strong><span style="font-size: 18px;">__get()</span></strong>方法

自动调用 __get() 方法的特定条件是在调用或获取当前环境下未定义或不可见的类属性时,定义该方法的语法格式如下:

public function __get($name){
    ... ... ;
}

其中参数$name表示要操作的变量名称,下面通过实例我们来看一下__get()方法的使用,实例如下:

<?php
    class father{
        public $study = '好好学习';
        private $study1 = '天天向上';
        public function __get($study1){
            echo '获取:“'.$study1.'”失败!';
        }
    }
    $object = new father();
    echo $object -> study.'<br>';
    echo $object -> study1.'<br>';
    echo $object -> study2.'<br>';
?>

输出结果:

1025.12.png

由上述结果可以看出在调用或获取当前环境下未定义或不可见的类属性时,会自动调用 __get() 方法。

<strong><span style="font-size: 18px;">__isset()</span></strong> 方法

自动调用 __isset() 方法的特定条件是当在类外部对类中不可访问或不存在的属性使用 isset()empty() 函数时,该方法的语法格式如下:

public function __isset($name){
    ... ... ;
}

其中我们需要注意的是:

参数 $name 为要访问的属性名称。

  • isset() 函数是用来检查一个变量是否存在并且还要判断不为 NULL,如果传入的变量存在则传回 true,不存在传回 false。

  • empty() 函数是用来检查一个变量是否为空,如果变量的值等于 FALSE,那么这个变量会被认为不存在。

  • 如果想要使用 isset() 或 empty() 函数对类中的私有属性进行检测的话,我们只需要在类中添加一个 __isset() 方法就可以了,当在类外部使用 isset() 或 empty() 函数时,会自动调用类里面的 __isset() 方法。

接下来我们通过实例来看一下__isset()方法的使用,实例如下:

360 AI助手
360 AI助手

360公司推出的AI聊天机器人聚合平台,集合了国内15家顶尖的AI大模型。

下载
<?php
    class father{
        public $study = '好好学习';
        private $name = '天天向上';
        public function __isset($name){
            if(property_exists('Website', $name)){
                echo '成员属性:“'.$name.'”存在!<br>';
            }else{
                echo '成员属性:“'.$name.'”不存在!<br>';
            }
        }
    }
    $object = new father();
    isset($object -> mother);
    isset($object -> name);
?>

输出结果:

1025.13.png

其中我们需要注意的是,property_exists() 函数可以用来检测类中是否定义了该属性,语法格式为

 property_exists($class_name,$property_name)

其中 $class_name 为字符串形式的类名,即判断类 class_name 中是否定义了 property_name 属性。

<strong><span style="font-size: 18px;">__unset() </span></strong>方法

自动调用__unset() 方法的特定条件是当在类外部对类中不可访问或不存在的属性使用 unset() 函数时,该方法的语法格式如下:

public function __unset($name){
    ... ... ;
}

其中我们需要注意的是:

  • 参数 $name 为要访问的属性名称。

  • unset() 函数的作用是删除指定的变量,需要传入一个或多个变量作为参数,另外,该函数没有返回值。

  • 可以使用 unset() 函数在类外部去删除类中的成员属性。如果要删除类中的公有属性的话直接使用 unset() 函数即可;

  • 如果要删除类中的私有属性的话,则需要在类中添加一个 __unset() 方法。

接下来我们通过实例来看一下__unset()方法的使用,实例如下:

<?php
    class father{
        public $name = 'http://c.biancheng.net/php/';
        private $study = 'C语言中文网';
        public function __unset($study){
            if(property_exists('father', $study)){
                unset($this->$study);
                echo '移除成员属性:“'.$study.'”成功!<br>';
            }else{
                echo '成员属性:“'.$study.'”不存在!<br>';
            }
        }
    }
    $object = new father();
    unset($object->name);
    unset($object->study);
    unset($object->study1);
?>

输出结果:

1025.14.png

由上述实例看出当在类外部对类中不可访问或不存在的属性使用 unset() 函数时,__unset() 方法会被自动调用。

上述实例中给大家介绍了一些常用的魔术方法,但这并不是魔术方法的全部,那接下来再给大家列举一些魔术方法:

  • __call()  --- 调用一个不存在的方法时自动调用   

  • __sleep()  ---  使用 serialize 序列化时自动调用    

  • __toString() ---   把对象转换成字符串时自动调用   

  • __invoke()  ---  当尝试把对象当方法调用时自动调用

  • __wakeup()  ---  使用 unserialize 反序列化时自动调用    

  • __callStatic()  ---  调用一个不存在的静态方法时自动调用    

  • __debugInfo()  ---  使用 var_dump() 打印对象信息时自动调用 

  • __set_state()  ---  当使用 var_export() 函数时自动调用,接受一个数组参数    

大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

826

2024.03.01

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

57

2025.09.05

java面向对象
java面向对象

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

60

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

595

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

217

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1556

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

641

2023.11.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

928

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

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