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

PHP中的魔术方法和预定义常数

Lisa Kudrow
发布: 2025-02-28 09:42:09
原创
895 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板