php魔术方法小结

# php魔术方法

__construct()

  • __construct(mixed ...$values = ""): void
PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。 

__destruct()

  • __destruct(): void
PHP 有析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

image-20220412141140868

__call()

  • public __call(string $name, array $arguments): mixed
  • 在对象中调用一个不可访问方法时,__call() 会被调用

__callStatic()

  • 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
在对象中调用一个不可访问方法时,__call() 会被调用。 
在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。 
$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。 

image-20220407235016342

这里差别就是  __call()是属于对象的,__callstatic()是属于类的
一个是对象在调用不可访问方法时触发,一个是类在使用不可访问的方法时触发

__set()

  • ​ public __set(string $name, mixed $value): void
在给不可访问(protected 或 private)或不存在的属性赋值时,__set() 会被调用。

image-20220412142548480

__get()

  • public __get(string $name): mixed
读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用。 

__isset()

  • public __isset(string $name): bool
当对不可访问(protected 或 private)或不存在的属性调用 isset() 或 empty() 时,__isset() 会被调用。 

__unset()

  • public __unset(string $name): void
当对不可访问(protected 或 private)或不存在的属性调用 unset() 时,__unset() 会被调用。 
注意:

因为 PHP 处理赋值运算的方式,__set() 的返回值将被忽略。类似的, 在下面这样的链式赋值中,__get() 不会被调用:

 $a = $obj->b = 8; 

__sleep()

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

__wakeup()

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

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

__serialize()

serialize() 函数会检查类中是否存在一个魔术方法 __serialize() 。如果存在,该方法将在任何序列化之前优先执行。它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 TypeError 错误。 

__unserialize()

serialize() 函数会检查类中是否存在一个魔术方法 __serialize() 。如果存在,该方法将在任何序列化之前优先执行。它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 TypeError 错误。

__tostring()

  • public __toString(): string
__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么

image-20220409114905428

__invoke()

  • __invoke( ...$values): mixed
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用

image-20220409115021102

__set_state()

  • ​ static __set_state(array $properties): object
 当调用 var_export() 导出类时,此静态 方法会被调用。

本方法的唯一参数是一个数组,其中包含按 ['property' => value, ...] 格式排列的类属性。 

var_export

  • var_export(mixed $value, bool $return = false): ?string
 var_export() 函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 函数类似,不同的是其返回的表示是合法的 PHP 代码。
参数

value:
    想要输出的变量名。
return:
    此参数为 true 时,var_export() 将返回一个变量,而不是输出它。

返回值:

参数 return 为 true 时返回变量。否则返回 null。

image-20220412143705080

__clone()

  • __clone(): void
 在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。

$copy_of_object = clone $object;

当对象被复制后,PHP 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。 

__debuginfo()

  • __debugInfo(): array
当通过 var_dump() 转储对象,获取应该要显示的属性的时候, 该函数就会被调用。如果对象中没有定义该方法,那么将会展示所有的公有、受保护和私有的属性。 

小总结:

对象层面:
__construct() 在对象初始化的时候调用
__destruct()  在对象销毁的时候调用
__wakeup()  反序列化前调用
__sleep() 序列化前调用
__serialize() 同sleep 两者都存在时只调用serialize
__unserialize() 同wakeup 两者都存在时只调用unserialize
__tostring()  对象在被当作字符串输出时调用,例如 echo
__invoke()  当尝试以函数方法调用对象$a()调用
__clone()  对象被clone时调用
__set_state()  当被var_export()时调用


属性层面:
__set() 对象在设置不可用或不存在的属性时调用
__get()  获取不可用或不存在的属性时被调用
__isset() 调用 isset()函数或者empty()函数时调用
__unset() 调用unset()函数时调用

方法层面:
__call()  对象在调用不可用方法的时候调用
__callStatic()  类在调用不可用方法的时候调用

参考连接:

https://www.php.net/manual/zh/language.oop5.magic.php
posted @ 2022-04-12 14:51  z2n3  阅读(52)  评论(0编辑  收藏  举报