PHP中的魔术函数及其使用?

时间:2016-07-19 13:25:42

标签: php

我最近一直在阅读有关魔术功能的内容,我对他们的实现感到困惑。某些魔术功能(例如__contruct()__destruct())非常有用。像__construct()这样的魔术函数可用于使用默认值初始化变量。

但是我真的很混淆__isset(), __call(), __toString(), etc等其他魔术函数的实现。实现魔术功能的实际目的是什么?

是的,我确实理解它们是在幕后调用的,并且不需要函数调用,但是就安全性-sql注入范围而言,它们在现实世界中的主要优势是什么。 isset()__isset()(或任何其他魔术函数)之间的主要区别以及我应该使用它们的情况?

1 个答案:

答案 0 :(得分:4)

除非你想要一些记录的魔术功能,否则你不应该在PHP中使用魔术方法。

它们允许您在使用这些特定对象时对某些事件做出反应。这意味着当您的对象发生某些事情时,您可以定义它在该实例中的反应方式。

这些方法中的每一种都是自动触发的,您只是定义了在这些情况下应该发生的事情。

在处理对象时,除了__construct()__destruct()之外,您可能还不需要使用其中的任何一个。

__construct() - 在首次创建对象时调用。您可以注入参数和依赖项来设置对象。

__destruct() - 在销毁对象时调用。你可以在这里写一些清理代码。关闭所有打开的数据流,数据库连接......无论如何。

__get() - 侦听属性的获取请求。

__set() - 侦听属性的设置请求。

__isset() - 通过在对象的属性上调用isset()或empty()来触发。

__unset() - 通过在对象的属性上调用unset()来触发。

__toString() - 允许您定义对象在被视为字符串时的行为方式。

__sleep() - 此处定义的代码将在您使用serialize()之前运行。因此,您可以定义应该序列化对象的哪些属性。

__wakeup() - 用于重新初始化序列化过程中可能已停止的任何任务。

__invoke() - 定义如果你要调用"你的班级应该如何行事?它就像一个函数一样使用它。

__clone() - 克隆对象时触发。 (如果您复制了对象,它们仍然会链接到原始对象,因为它们仍在引用它。克隆可以为您提供干净的副本。)

__debugInfo - 在对象上使用var_dump()时触发。您可以使用它来控制转储中应显示的信息类型。如果方法未在对象上定义,则将显示所有公共属性,受保护属性和私有属性。