搜索
首页后端开发php教程PHP中的魔术方法和预定义常数

Magic Methods and Predefined Constants in 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_VERSIONPHP_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中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
解释负载平衡如何影响会话管理以及如何解决。解释负载平衡如何影响会话管理以及如何解决。Apr 29, 2025 am 12:42 AM

负载均衡会影响会话管理,但可以通过会话复制、会话粘性和集中式会话存储解决。1.会话复制在服务器间复制会话数据。2.会话粘性将用户请求定向到同一服务器。3.集中式会话存储使用独立服务器如Redis存储会话数据,确保数据共享。

说明会话锁定的概念。说明会话锁定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP会议的选择吗?有其他PHP会议的选择吗?Apr 29, 2025 am 12:36 AM

PHP会话的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。1.Cookies通过在客户端存储数据来管理会话,简单但安全性低。2.Token-basedAuthentication使用令牌验证用户,安全性高但需额外逻辑。3.Database-basedSessions将数据存储在数据库中,扩展性好但可能影响性能。4.Redis/Memcached使用分布式缓存提高性能和扩展性,但需额外配

在PHP的上下文中定义'会话劫持”一词。在PHP的上下文中定义'会话劫持”一词。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻击者通过获取用户的sessionID来冒充用户。防范方法包括:1)使用HTTPS加密通信;2)验证sessionID的来源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什么?PHP的完整形式是什么?Apr 28, 2025 pm 04:58 PM

文章讨论了PHP,详细介绍了其完整形式,在We​​b开发中的主要用途,与Python和Java的比较以及对初学者的学习便利性。

PHP如何处理形式数据?PHP如何处理形式数据?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _获取超级全局的php处理数据,并通过验证,消毒和安全数据库交互确保安全性。

PHP和ASP.NET有什么区别?PHP和ASP.NET有什么区别?Apr 28, 2025 pm 04:56 PM

本文比较了PHP和ASP.NET,重点是它们对大规模Web应用程序,性能差异和安全功能的适用性。两者对于大型项目都是可行的,但是PHP是开源和无关的,而ASP.NET,

PHP是对病例敏感的语言吗?PHP是对病例敏感的语言吗?Apr 28, 2025 pm 04:55 PM

PHP的情况敏感性各不相同:功能不敏感,而变量和类是敏感的。最佳实践包括一致的命名和使用对案例不敏感的功能进行比较。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具