您现在的位置是:群英 > 开发技术 > PHP语言
列举php语言中魔术方法该怎么样用
Admin发表于 2022-12-14 11:05:39490 次浏览
这篇文章主要给大家介绍“列举php语言中魔术方法该怎么样用”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“列举php语言中魔术方法该怎么样用”文章能对大家有所帮助。

目录
  • php魔术方法
  • __construct()与__destruct()
  • __call
  • __get
  • __set
  • __isset
  • __unset
  • __sleep
  • __wakeup
  • __toString
  • __invoke

php魔术方法

在php类保留方法中以 “__”两个下划线开头的函数称为魔术方法,我的理解为php类设计中自定义好的函数。

常见的魔术方法有:

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用
__clone(),当对象复制完成时调用
__autoload(),尝试加载未定义的类
__debugInfo(),打印所需调试信息

__construct()与__destruct()

__construct() 构造函数与 __destruct() 析构函数,与其他的语言如java,c#,一样,构造函数就是在对象实例化的时候先执行初始化的方法。

__construct()构造函数只有在new 一个对象的时候会触发,在serialize 序列化和unserialize反序列化中都不会触发

<?php
class demo1{
    private $k1;
    public function __construct()
    {
        echo("构造函数被调用"."<br>");
    }
    public  function f1(){
        echo("f1 函数被调用");
    }
}
echo("0000"."<br>");
$f=new demo1();
echo("1111"."<br>");
$a=serialize($f);
echo("2222"."<br>");
unserialize($a);
?>

输出结果

__destruct() 析构函数则在对象销毁和serialize 反序列化的情况下会被触发。如下

<?php
class demo1{
    private $k1;
    public function __destruct()
    {
        echo("析构函数被调用"."<br>");
    }
}
$f=new demo1();
echo("0000"."<br>");
$a=serialize($f);
echo("1111"."<br>");
unset($f);
echo("2222"."<br>");
unserialize($a);
?>

输出结果

__call

__call 魔术方法的作用是当前对象调用一个不存在的方法时,就会被触发

<?php
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
	  //当调用不存在的方法时,方法名作为参数传到$name 变量,方法名的输入参数传到arguments参数列表中
    public function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
        echo($name."---".$arguments[0]);
    }
}
$f=new demo1();
$f->f2("123");//调用不存在的方法f2()
?>

输出结果

__get

__get() 魔术方法是当访问一个对象不存在的变量时就会被触发

<?php
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __get($name)//不存在的变量k会以参数传到$name
    {
        echo($name);
    }
}
$f=new demo1();
$f->k;//不存在的变量k
?>

输出结果

__set

__set() 魔术方法是当给一个对象不存在的变量赋值时就会被触发

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __set($name, $value)
    {
        echo($name."---".$value);
    }
}
$f=new demo1();
$f->k=123; //给不存在的成员变量赋值
?>

输出结果

__isset

当对不可访问属性调用isset()或empty()时会触发,例如访问类的私有属性,类不存在的成员属性

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __isset($name)
    {
       echo($name);
    }
}
$f=new demo1();
$f2=unserialize(serialize($f));//反序列化
isset($f2->k1);//使用isset方法判断私有成员属性k1
empty($f2->k1);//使用empty方法判断私有成员属性k1
?>

输出结果

__unset

当尝试使用unset() 销毁函数去销毁一个不可访问的成员属性时会触发,不可访问(包括私有成员属性,不存在的成员属性)

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __unset($name)
    {
        echo($name);
    }
}
$f=new demo1();
$f2=unserialize(serialize($f));//反序列化
unset($f2->k1);//使用unset销毁私有成员属性k1
unset($f2->faaa);//使用unset销毁不存在的成员属性faaa
?>

输出结果

__sleep

当对象被serialize 序列化时触发调用__sleep

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __sleep()
    {
        echo("在被序列化时被调用");
    }
}
$f=new demo1();
echo("00000"."</br>");
serialize($f);
?>

输出结果

__wakeup

当进行unserialize 反序列化对象时,__wakeup魔术方法会被触发,看起来__wakeup与__sleep 触发条件是相反的

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __wakeup()
    {
        echo("在被反序列化时被调用");
    }
}
$f=new demo1();
$uz=serialize($f);
echo("00000"."</br>");
unserialize($uz);
?>

输出结果

__toString

如果一个对象类中存在__toString魔术方法,这个对象类被当做字符串进行处理时,就会触发__toString魔术方法,而不会产生错误

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __toString()
    {
        echo("__toString 被触发了");
        return "";
    }
}
$f=new demo1();
echo($f);
?>

输出结果

__invoke

当一个对象类中存在__invoke魔术方法,这个对象类被当作函数进行调用时,就会触发__invoke魔术方法,而不会产生错误

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函数被调用");
    }
    public function __invoke()
    {
       echo("__invoke 被触发了");
    }
}
$f=new demo1();
$f();
?>

输出结果



感谢各位的阅读,以上就是“列举php语言中魔术方法该怎么样用”的内容了,通过以上内容的阐述,相信大家对列举php语言中魔术方法该怎么样用已经有了进一步的了解,如果想要了解更多相关的内容,欢迎关注群英网络,群英网络将为大家推送更多相关知识点的文章。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: php魔术方法
相关信息推荐
2021-12-24 18:02:34 
摘要:这篇文章给大家分享的是用C语言编程一个简易的个税计算器的介绍,对于加减乘除计算的实现我们之前有了解过,这篇个税计算器对大家加深C语言的理解有一定的帮助,会使用到C语言的函数,if选择语句,文中示例代码介绍的很详细,感兴趣的朋友接下来一起跟随小编看看吧。
2022-07-06 17:35:34 
摘要:这篇文章主要介绍的是为什么GO不支持循环引用,学习 Go 语言的开发者越来越多了,很多小伙伴在使用时,就会遇到种种不理解的问题,其中一点就是包的循环引用的报错,下main文章我们一起来看看学习原因
2022-07-30 17:32:05 
摘要:react可用ui组件库有:1、Material-UI,有用于布局、表单、导航、数据显示和许多其他小部件的组件;2、Ant Design,有60多个组件,带有可预测的静态类型;3、Blueprint,有40多个组件;4、React Bootstrap,提供了与大量已经存在的Bootstrap主题的完全兼容性;5、Onsen UI,提供选项卡、边菜单、堆栈导航、列表、表单等组件。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部