搜索
首页后端开发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
在Laravel中使用Flash会话数据在Laravel中使用Flash会话数据Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React构建具有Laravel后端的React应用程序:第2部分,ReactMar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

php中的卷曲:如何在REST API中使用PHP卷曲扩展php中的卷曲:如何在REST API中使用PHP卷曲扩展Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了简化的HTTP响应在Laravel测试中模拟了Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本在Codecanyon上的12个最佳PHP聊天脚本Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

Laravel中的通知Laravel中的通知Mar 04, 2025 am 09:22 AM

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV

解释PHP中晚期静态结合的概念。解释PHP中晚期静态结合的概念。Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

PHP记录:PHP日志分析的最佳实践PHP记录:PHP日志分析的最佳实践Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

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脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位 下载

VSCode Windows 64位 下载

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境