• 技术文章 >后端开发 >php教程

    【php类与对象】魔术方法

    不言不言2018-04-14 15:50:48原创760

    本篇文章给大家分享的内容是关于【php类与对象】魔术方法 ,有着一定的参考价值,有需要的朋友可以参考一下

    魔术方法 ( Magic methods )

    __construct()__destruct()__callStatic()__set()__isset()__unset()__wakeup()__invoke()__clone() __debugInfo()

    __sleep() 和 __wakeup()

    public array __sleep ( void )void __wakeup ( void )

    __sleep()作用于提交未提交的数据,或类似的清理操作。例如有一些很大的对象,但不需要全部保存。

    __wakeup() 作用于反序列化操作。例如重新建立数据库连接,或执行其它初始化操作。

    serialize()会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

    unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。


    以上概念的解释

    串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.

    当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.

    在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用, 然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致 一个E_NOTICE错误。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用 __wakeup方法,预先准备对象数据。

    __sleep方法常用于提交未提交的数据,或类似的操作。同时,如果你有一些很大的对象, 不需要保存,这个功能就很好用。__wakeup经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。


    __toString()

    用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。
    此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。不能在 __toString() 方法中抛出异常。这么做会导致致命错误。

    Example #2 简单示例<?php// Declare a simple classclass TestClass{
        public function __toString() {
            return '类被当成字符串时tostring返回字符串';        // return intval('tostring返回值的内容不为字符串');//Recoverable fatal error: Method TestClass::__toString() must return a string value
        }
    }$class = new TestClass();echo $class;//echo (string)$class; // 未定义 __toString()方法,并将对象转换为字符串,报错Recoverable fatal error: Object of class TestClass could not be converted to string?>

    需要指出的是
    在PHP 5.2.0 之前,__toString() 方法只有在直接使用于 echo 或 print 时才能生效。
    PHP 5.2.0 之后,则可以在任何字符串环境生效(例如通过 printf(),使用 %s 修饰符),但不能用于非字符串环境(如使用 %d 修饰符)。
    自 PHP 5.2.0 起,如果将一个未定义 __toString() 方法的对象转换为字符串,会产生 E_RECOVERABLE_ERROR 级别的错误。


    __invoke()

    mixed __invoke ([ $... ] )

    当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。(PHP 5.3.0 )

    Example #3 使用 __invoke()<?phpclass CallableClass {
        function __invoke($x) {
            var_dump($x);    //int(5)
        }
    }$obj = new CallableClass;$obj(5);
    var_dump(is_callable($obj));   //bool(true)?>

    __set_state()

    相关推荐:

    【php类与对象】遍历

    【php类与对象】匿名类

    【php类与对象】重载

    以上就是【php类与对象】魔术方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php 方法 魔术
    上一篇:PHP生成语音 下一篇:php中时间轴开发
    大前端线上培训班

    相关文章推荐

    • PHP数据库学习之怎样使用PDO执行SQL语句?• PHP数据库学习之怎样使用PDO连接数据库?• PHP表单学习之表单的输入与验证• PHP数据库学习之怎样使用PDO获取查询结果?• PHP中怎样去连接MySQL数据库?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网