php 魔术方法总结

概述

PHP: 魔术方法 - Manual

  • php 魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作

__construct() 构造函数

  • 通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值
  • 在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
class Person
{
public $name;
public $age;
public $sex;


public function __construct($name = "", $sex = "男", $age = 22)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function say()
{
echo "我叫:".this->name.",性别:".$this->sex.",年龄:".$this->age;
}
}

$Person = new Person();
echo $Person->say();
?>

//输出结果
我叫:张三,性别:男,年龄:22

__destruct() 析构函数

  • php 的执行工作流是当前端进程调用后端的 php 程序阶段性完成时(例如页面加载完成,调用 php 也结束了),其中类就会逐一销毁,而该函数可以在销毁之前执行一些关闭文件,释放内存等结束性操作

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Person{
public $name;
public function __destruct()
{
echo "waiting!"
}
}

$Person = new Person();
unset($Person); //手动销毁Person对象,注意这个不是__unset()重载方法
?>

//输出结果
waiting!

重载方法

属性重载

__set()

  • 在给不可访问( protectedprivate )或不存在的属性赋值时,__set() 会被调用。

__get()

  • 读取不可访问( protectedprivate )或不存在的属性的值时,__get()会被调用。

__isset()

  • 当对不可访问( protectedprivate )或不存在的属性调用 isset() 或 empty() 时,__isset() 会被调用。

__unset()

  • 当对不可访问( protectedprivate )或不存在的属性调用 unset() 时,__unset() 会被调用。

方法重载

__call()

在对象中调用一个不可访问方法时,__call() 会被调用。

__callStatic()

在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

__toString() 被当作字符串时调用方法

  • 该方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php  
    // 声明一个简单的类
    class TestClass
    {
    public $foo;

    public function __construct($foo)
    {
    $this->foo = $foo;
    }

    public function __toString() {
    return $this->foo;
    }
    }

    $class = new TestClass('Hello');
    echo $class;
    ?>

    //输出结果
    Hello

__invoke() 方法

  • 当尝试以调用函数的方式调用一个对象时,该方法会被自动调用

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php  
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

//输出结果
int(5)
bool(true)

__sleep() 序列化特指方法

![[php 序列化及反序列化#序列化特别的魔术方法- __sleep()]]

__wakeup() 反序列化变更方法

![[php 序列化及反序列化#反序列化特别的魔术方法- __wakeup()]]

Author

Resek4

Posted on

2022-02-25

Updated on

2023-01-27

Licensed under

Comments