zoukankan      html  css  js  c++  java
  • PHP面向对象----- 魔术方法

    1、__sleep和__wakeup

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

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

    user.php(转自)大眼的博客

    <?php
    class user {
        public $name;
        public $id;
         
        function __construct() {    // 给id成员赋一个uniq id
            $this->id = uniqid();
            }
             
        function __sleep() {       //此处不串行化id成员
            return(array('name'));
            }
             
        function __wakeup() {
            $this->id = uniqid();
            }
        }
     
    $u = new user();
     
    $u->name = "Leo";
     
    $s = serialize($u); //serialize串行化对象u,此处不串行化id属性,id值被抛弃
     
    $u2 = unserialize($s); //unserialize反串行化,id值被重新赋值
     
      
     
    //对象u和u2有不同的id赋值
     
    print_r($s);
    echo '<br/>';
     
    print_r($u2);
     

    可以很清楚地看到,$s中不再含有id属性,$u2中又调用了__wakeup魔术方法,获得id属性。(目前对两个魔术方法了解不深,希望在接下来的学习中加深了解)。

    2、__toString方法

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

    <?php
    
    class TestClass
    {
        public $foo;
    
        public function __construct($foo) 
        {
            $this->foo = $foo;
        }
    
        public function __toString() {
            return $this->foo;
        }
    }
    
    $class = new TestClass('Hello');
    echo $class;
    ?>

    如果不添加魔术方法,则会报致命错误。

    3、__invoke()方法

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

    <?php
    class CallableClass 
    {
        function __invoke($x) {
            var_dump($x);
        }
    }
    $obj = new CallableClass;
    $obj(5);
    var_dump(is_callable($obj));
    ?>

    4、 __get()__set()__isset() 和 __unset() 

    PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods)来实现的。

    当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用"不可访问属性(inaccessible properties)"和"不可访问方法(inaccessible methods)"来称呼这些未定义或不可见的类属性或方法。

    5、方法重载

    public mixed __call ( string $name , array $arguments )

  • 相关阅读:
    5.2基础标签学习
    6.15ajax选房子
    6.15ajax写数据库的增删改查
    [Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
    DOM4J 读取XML配置文件进行数据库连接
    Bit Map解析
    图像像素操作
    九度OJ 1025 最大报销额(01背包)
    MYSQL :逗号分隔串表,分解成竖表
    interrupt & storage & DMA
  • 原文地址:https://www.cnblogs.com/liepan/p/7892855.html
Copyright © 2011-2022 走看看