我最近一直在阅读有关魔术功能的内容,我对他们的实现感到困惑。某些魔术功能(例如__contruct()
和__destruct()
)非常有用。像__construct()
这样的魔术函数可用于使用默认值初始化变量。
但是我真的很混淆__isset(), __call(), __toString(), etc
等其他魔术函数的实现。实现魔术功能的实际目的是什么?
是的,我确实理解它们是在幕后调用的,并且不需要函数调用,但是就安全性-sql注入范围而言,它们在现实世界中的主要优势是什么。 isset()
和__isset()
(或任何其他魔术函数)之间的主要区别以及我应该使用它们的情况?
答案 0 :(得分:4)
除非你想要一些记录的魔术功能,否则你不应该在PHP中使用魔术方法。
它们允许您在使用这些特定对象时对某些事件做出反应。这意味着当您的对象发生某些事情时,您可以定义它在该实例中的反应方式。
这些方法中的每一种都是自动触发的,您只是定义了在这些情况下应该发生的事情。
在处理对象时,除了__construct()
和__destruct()
之外,您可能还不需要使用其中的任何一个。
__construct()
- 在首次创建对象时调用。您可以注入参数和依赖项来设置对象。
__destruct()
- 在销毁对象时调用。你可以在这里写一些清理代码。关闭所有打开的数据流,数据库连接......无论如何。
__get()
- 侦听属性的获取请求。
__set()
- 侦听属性的设置请求。
__isset()
- 通过在对象的属性上调用isset()或empty()来触发。
__unset()
- 通过在对象的属性上调用unset()来触发。
__toString()
- 允许您定义对象在被视为字符串时的行为方式。
__sleep()
- 此处定义的代码将在您使用serialize()之前运行。因此,您可以定义应该序列化对象的哪些属性。
__wakeup()
- 用于重新初始化序列化过程中可能已停止的任何任务。
__invoke()
- 定义如果你要调用"你的班级应该如何行事?它就像一个函数一样使用它。
__clone()
- 克隆对象时触发。 (如果您复制了对象,它们仍然会链接到原始对象,因为它们仍在引用它。克隆可以为您提供干净的副本。)
__debugInfo
- 在对象上使用var_dump()时触发。您可以使用它来控制转储中应显示的信息类型。如果方法未在对象上定义,则将显示所有公共属性,受保护属性和私有属性。