php中魔术方法和魔术常量是什么

php中,魔术方法是指以两个下划线“__”开头的方法,例如“__call()”、“__get()”、“__set()”等;魔术常量是指会随着他们所在代码位置的变化而变化的8个常量,例如“__LINE__”、“__FILE__”等。

php中魔术方法和魔术常量是什么

本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

魔术方法(Magic methods)

PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用。 魔术方法包括:

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

__construct()和__destruct()

构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭

handle = fopen(...);    }    function __destruct(){        fclose($this->handle);    }}?>

登录后复制

这两个方法在继承时可以扩展,例如:

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


登录后复制

__call()和__callStatic()

在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。

runTest('in object context');MethodTest::runTest('in static context');?>

登录后复制

__get(),__set(),__isset()和__unset()

当get/set一个类的成员变量时调用这两个函数。例如我们将对象变量保存在另外一个数组中,而不是对象本身的成员变量

data[$name] = $value;    }    public function __get($name){        if(array_key_exists($name, $this->data))            return $this->data[$name];        return NULL;    }    public function __isset($name){        return isset($this->data[$name])    }    public function unset($name){        unset($this->data[$name]);    }}?>

登录后复制

__sleep()和__wakeup()

当我们在执行serialize()和unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:

server = $server;        $this->username = $username;        $this->password = $password;        $this->db = $db;        $this->connect();    }    private function connect()    {        $this->link = mysql_connect($this->server, $this->username, $this->password);        mysql_select_db($this->db, $this->link);    }    public function __sleep()    {        return array('server', 'username', 'password', 'db');    }    public function __wakeup()    {        $this->connect();    }}?>

登录后复制

__toString()

对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象


登录后复制

这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。

__invoke()

调用函数的方式调用一个对象时的回应方法。如下


登录后复制

__set_state()

调用var_export()导出类时,此静态方法会被调用。

var1 = $an_array['var1'];        $obj->var2 = $an_array['var2'];        return $obj;    }}$a = new A;$a->var1 = 5;$a->var2 = 'foo';var_dump(var_export($a));?>

登录后复制

__clone()

当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。


登录后复制

魔术常量(Magic constants)

PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。

__LINE__,文件中的当前行号__FILE__,文件的完整路径和文件名__DIR__,文件所在的目录__FUNCTION__,函数名称__CLASS__,类的名称__TRAIT__,Trait的名字__METHOD__,类的方法名__NAMESPACE__,当前命名空间的名称

这些魔术常量常常被用于获得当前环境信息或者记录日志。

推荐学习:《PHP视频教程》

以上就是php中魔术方法和魔术常量是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2510953.html

(0)
上一篇 2025年3月5日 14:22:13
下一篇 2025年2月25日 14:29:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 三分钟带你了解PHP操作用户提交内容时需要注意的危险函数

    本篇文章给大家介绍一下php操作用户提交内容时需要注意的危险函数。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 对于我们的程序开发来说,用户的输入是解决安全性问题的第一大入口。为什么这么说呢?不管是SQL注入、XSS还是…

    2025年3月5日
    200
  • 如何学习方法参数类型声明

    本篇文章给大家介绍一下学习方法参数类型声明的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 不管从事什么行业,现在都是活到老学到老的趋势,特别是我们这堆码农。这回也不用说新技术用不上,光光是PHP文档的学习都会发现非…

    2025年3月5日
    200
  • PHP跨页传递失败怎么办?

    本篇文章给大家介绍一下解决php跨页传递失败的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 这篇文章主要介绍了PHP SESSION跨页面传递失败解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一…

    2025年3月5日
    200
  • PHP如何更好地调用API接口

    本篇文章给大家介绍一下php调用api接口更好的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 API接口在各种场景中已经非常普遍使用,通常在PHP后台调用API接口,需要通过Curl库来自己封装,且不说各种充值门槛…

    2025年3月5日
    200
  • 如何用PHP制作MVC框架大体流程

    上篇文章给大家介绍了《在php中如何运用model类的select方法?》,本文继续给大家介绍如何用php制作mvc框架大体流程有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 PHP高级头战-MVC框架 1、 mvcmod…

    2025年3月5日
    200
  • PHP中什么是工厂模式以及工厂方法模式?

    工厂方法模式核心是工厂类不再负责所有对象的创建,而是将具体创建的工作交给子类去做,成为一一个抽象工厂角色,它仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节,我们可以深入探讨: 相关推荐:《PHP中什么是设计模式…

    编程技术 2025年3月5日
    200
  • PHP中什么是观察者模式?如何运用?

    对于观察者模式,我们可能并不是那么耳熟闻详,它是一种事件系统,意味着这一模式允许某个类观察另一一个类的状态,当被观察的类状态发生改变的时候,观察类可以收到通知并且做出相应的动作;观察者模式提供了避免组件之间紧密耦合的另一种方法;因此我们就一…

    2025年3月5日
    200
  • PHP中Error与Exception的区别是什么

    网上error与exception区别的资料大多是java的解释,貌似php的异常处理过程跟java差不多,下面就跟着小编一起学习php中的error与exception的区别与捕获,需要的小伙伴可以参考参考。 写了一段 JSON 解析的代…

    2025年3月5日
    200
  • 如何使用memory_limit限制PHP进程的内存使用

    虚拟主机php中memory_limit是php单个脚本单次执行最大可用内存限制;默认限制为256mb,最大可调整为512mb。下面由小编介绍使用memory_limit限制php进程的内存使用方法。 memory_limit 顾名思义,即…

    2025年3月5日
    200
  • PHP数组中什么是查找算法?如何查找?

    php中查找算法有很多种,你知道的有哪几种呢?对于查找算法的含义你又是如何理解的?本篇文章就是带你去探索关于算法的一些奥秘,一起探讨数组中什么是查找算法?如何查找? 相关推荐:在PHP中什么是门面模式?他的优点是什么?适用场景是什么? 查找…

    2025年3月5日
    200

发表回复

登录后才能评论