PHP中的魔术方法和预定义常数
核心要点
- PHP 提供预定义常量和魔术方法来增强代码功能。预定义常量提供关于代码和 PHP 的只读信息,而魔术方法是类中保留的名称,用于启用特殊的 PHP 功能。
- 预定义常量(用双下划线括起来的全部大写字母)提供关于代码的信息。示例包括
__LINE__
(返回源文件中的行号)、__FILE__
(表示文件的名称,包括其完整路径)、__DIR__
(仅表示文件的路径)、__CLASS__
(返回当前类的名称)、__FUNCTION__
(返回当前函数的名称)、__METHOD__
(表示当前方法的名称)和__NAMESPACE__
(返回当前命名空间的名称)。 - 魔术方法提供了与特殊 PHP 行为挂钩的机制。它们包括
__construct()
(用于创建类的对象实例)、__destruct()
(当对象被 PHP 的垃圾收集器销毁时调用)、__get()
(如果属性未定义或不可访问,并且在 getter 上下文中调用时调用)、__set()
(在 setter 上下文中为未定义的属性调用)、__isset()
(检查属性是否已设置)、__unset()
(接收一个参数,即程序想要取消设置的属性的名称)和__toString()
(帮助将对象表示为字符串)。
PHP 为程序提供了一组特殊的预定义常量和魔术方法。与使用 define()
设置的常量不同,这些常量的值取决于它们在代码中的使用位置,并用于访问关于代码和 PHP 的只读信息。魔术方法是您可以在类中使用的保留方法名称,用于与特殊的 PHP 功能挂钩。如果您尚未了解 PHP 的魔术方法和常量,那么本文适合您!我将回顾一些更有用的方法以及如何在代码中使用它们。
预定义常量
预定义常量用于访问有关代码的信息。这里的常量用双下划线括起来的全部大写字母编写,例如 __LINE__
和 __FILE__
。以下是 PHP 提供的一些有用的常量:
-
__LINE__
返回源文件中常量出现的行号,如下所示:
<?php echo "line number: " . __LINE__; // line number: 2 echo "line number: " . __LINE__; // line number: 3 echo "line number: " . __LINE__; // line number: 4 ?>
__FILE__
表示文件的名称,包括其完整路径,如下所示:
<?php echo "the name of this file is: " . __FILE__; // the directory and name of file is: C:wampwwwindex.php ?>
__DIR__
仅表示文件的路径:
<?php echo "the directory of this file is: " . __DIR__; // the directory of this file is: C:wampwww ?>
__CLASS__
返回当前类的名称:
<?php class Sample { public function __construct() { echo __CLASS__; } } $obj = new Sample(); // Sample ?>
__FUNCTION__
返回当前函数的名称:
<?php function mySampleFunc() { echo "the name the function is: " . __FUNCTION__; } mySampleFunc(); //the name of function is: mySampleFunc ?>
__METHOD__
表示当前方法的名称:
<?php class Sample { public static function myMethod() { echo "the name of method is: " . __METHOD__; } } Sample::myMethod(); // the name of the method is: myMethod ?>
__NAMESPACE__
返回当前命名空间的名称:
<?php namespace MySampleNS; echo "the namespace is: " . __NAMESPACE__; // the name space is: MySampleNS ?>
魔术方法
魔术方法提供与特殊 PHP 行为挂钩的机制。与之前的常量不同,它们的名称使用两个前导下划线以小写/驼峰式字母编写,例如 __construct()
和 __destruct()
。__construct()
是 PHP 调用以创建类对象实例的魔术方法。它可以接受任意数量的参数。
<?php class MySample { public function __construct($foo) { echo __CLASS__ . " constructor called with $foo."; } } $obj = new MySample(42); // MySample constructor called with 42 ?>
顾名思义,__destruct()
方法在对象被 PHP 的垃圾收集器销毁时调用。它不接受任何参数,通常用于执行可能需要的任何清理操作,例如关闭数据库连接。
<?php class MySample { public function __destruct() { echo __CLASS__ . " destructor called."; } } $obj = new MySample; // MySample destructor called ?>
我们的下一个魔术方法处理属性重载,并提供了一种让 PHP 处理未定义(或我们无法访问)的属性和方法调用的方法。如果属性未定义(或不可访问)并且在 getter 上下文中调用,则 PHP 会调用 __get()
方法。该方法接受一个参数,即属性的名称。它应该返回一个值,该值被视为属性的值。__set()
方法在 setter 上下文中为未定义的属性调用。它接受两个参数,属性名称和值。
<?php echo "line number: " . __LINE__; // line number: 2 echo "line number: " . __LINE__; // line number: 3 echo "line number: " . __LINE__; // line number: 4 ?>
在上面的示例代码中,属性名称未在类中定义。我尝试将值“mysample”赋值给它,PHP 调用魔术方法 __set()
。它接收“name”作为 $prop
参数和“Alireza”作为 $value
,我将值存储在私有 $myArray
数组中。__get()
方法的工作方式类似;当我输出 $obj->name
时,会调用 __get()
方法,并将“name”作为 $prop
参数传入。还有其他魔术方法可以帮助我们检索和检查不可访问的成员变量,这些成员变量也出现在示例代码中:__isset()
、__unset()
和 __toString()
。__isset()
和 __unset()
都由 PHP 中名称相同(不带下划线)的函数触发。__isset()
检查属性是否已设置,并接受一个参数,即我们要测试的属性。__unset()
接收一个参数,即程序想要取消设置的属性的名称。在许多情况下,将对象表示为字符串非常有用,例如输出给用户或其他进程。通常情况下,PHP 将它们表示为内存中的 ID,这对我们来说并不好。__toString()
方法帮助我们将对象表示为字符串。该方法在任何将对象用作字符串的情况下都会被触发,例如:echo "Hello $obj"
。它也可以像任何其他普通公共方法一样直接调用,这比诸如附加空字符串以强制转换之类的技巧更可取。
总结
面向对象编程可以产生更易于维护和测试的代码。它帮助我们创建更好、更标准的 PHP 代码。此外,它还可以利用 PHP 提供的魔术方法和常量。
图片来自 Stepan Kapl / Shutterstock
PHP 魔术方法和预定义常量的常见问题解答
PHP 中有哪些不同类型的魔术方法?
PHP 中的魔术方法是当满足某些条件时会自动触发的特殊函数。它们总是以双下划线 () 开头。PHP 中不同类型的魔术方法包括 `construct()、
destruct()、
call()、
callStatic()、
get()、
set()、
isset()、
unset()、
sleep()、
wakeup()、
toString()、
invoke()、
set_state()、
clone()和
debugInfo()`。这些方法中的每一个都由特定事件触发,例如创建对象时、访问属性时或调用方法时。
如何在 PHP 中使用预定义常量?
PHP 中的预定义常量是始终可用的内置常量。它们包括核心常量,如 PHP_VERSION
和 PHP_OS
,以及各种扩展定义的许多其他常量。要使用预定义常量,只需编写其名称,而无需在其前面添加美元符号 ($) 。例如,要获取当前的 PHP 版本,可以使用 PHP_VERSION
常量,如下所示:echo PHP_VERSION;
PHP 中 __construct()
魔术方法的用途是什么?
PHP 中的 __construct()
魔术方法在每次从类创建新对象时都会自动调用。它通常用于初始化对象的属性或执行对象在使用前所需的任何设置。
我可以在 PHP 中定义自己的常量吗?
是的,您可以使用 define()
函数或 const
关键字在 PHP 中定义自己的常量。定义常量后,就不能更改或取消定义它。
PHP 中魔术方法和常规方法有什么区别?
PHP 中魔术方法和常规方法的主要区别在于,魔术方法会由某些事件自动触发,而常规方法需要显式调用。此外,魔术方法总是以双下划线 (__) 开头,而常规方法则不是。
如何检查 PHP 中是否定义了常量?
您可以使用 defined()
函数检查 PHP 中是否定义了常量。此函数将常量的名称作为字符串,如果常量已定义,则返回 true,否则返回 false。
PHP 中 __destruct()
魔术方法的用途是什么?
PHP 中的 __destruct()
魔术方法在对象被销毁或脚本结束时自动调用。它通常用于执行清理任务,例如关闭数据库连接或释放资源。
我可以在 PHP 中将魔术方法与静态方法一起使用吗?
是的,您可以在 PHP 中将魔术方法与静态方法一起使用。__callStatic()
魔术方法在调用不可访问或类中不存在的静态方法时会自动触发。
PHP 中预定义常量的一些常见用途是什么?
PHP 中的预定义常量通常用于获取有关 PHP 环境的信息或控制某些函数的行为。例如,PHP_VERSION
常量可用于检查 PHP 版本,PHP_OS
常量可用于检查操作系统。
我可以在 PHP 中重写魔术方法吗?
是的,您可以在 PHP 中重写魔术方法。创建子类时,您可以提供自己的魔术方法实现。但是,如果您想调用父类的实现,可以使用 parent
关键字。
以上是PHP中的魔术方法和预定义常数的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
