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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 )

以上是关于PHP面向对象----- 魔术方法的主要内容,如果未能解决你的问题,请参考以下文章

前端学PHP之面向对象系列第二篇——魔术方法

PHP中的面向对象OOP中的魔术方法

PHP面向对象 –魔术方法

PHP中的面向对象OOP中的魔术方法

PHP中的面向对象OOP中的魔术方法

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