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

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

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

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

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

Dreamweaver CS6
视觉化网页开发工具

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

热门话题

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

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

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

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

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