码迷,mamicode.com
首页 > Web开发 > 详细

PHP面向对象----- 魔术方法

时间:2017-11-25 11:23:32      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:环境   loading   对象   不同   types   param   ssi   怎样   操作   

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 )

PHP面向对象----- 魔术方法

标签:环境   loading   对象   不同   types   param   ssi   怎样   操作   

原文地址:http://www.cnblogs.com/liepan/p/7892855.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!