核心要点
__LINE__
(返回源文件中的行号)、__FILE__
(表示文件的名称,包括其完整路径)、__DIR__
(仅表示文件的路径)、__CLASS__
(返回当前类的名称)、__FUNCTION__
(返回当前函数的名称)、__METHOD__
(表示当前方法的名称)和 __NAMESPACE__
(返回当前命名空间的名称)。__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 中不同类型的魔术方法包括 `construct()、
destruct()、
call()、
callStatic()、
get()、
set()、
isset()、
unset()、
sleep()、
wakeup()、
toString()、
invoke()、
set_state()、
clone()和
debugInfo()`。这些方法中的每一个都由特定事件触发,例如创建对象时、访问属性时或调用方法时。
PHP 中的预定义常量是始终可用的内置常量。它们包括核心常量,如 PHP_VERSION
和 PHP_OS
,以及各种扩展定义的许多其他常量。要使用预定义常量,只需编写其名称,而无需在其前面添加美元符号 ($) 。例如,要获取当前的 PHP 版本,可以使用 PHP_VERSION
常量,如下所示:echo PHP_VERSION;
__construct()
魔术方法的用途是什么?PHP 中的 __construct()
魔术方法在每次从类创建新对象时都会自动调用。它通常用于初始化对象的属性或执行对象在使用前所需的任何设置。
是的,您可以使用 define()
函数或 const
关键字在 PHP 中定义自己的常量。定义常量后,就不能更改或取消定义它。
PHP 中魔术方法和常规方法的主要区别在于,魔术方法会由某些事件自动触发,而常规方法需要显式调用。此外,魔术方法总是以双下划线 (__) 开头,而常规方法则不是。
您可以使用 defined()
函数检查 PHP 中是否定义了常量。此函数将常量的名称作为字符串,如果常量已定义,则返回 true,否则返回 false。
__destruct()
魔术方法的用途是什么?PHP 中的 __destruct()
魔术方法在对象被销毁或脚本结束时自动调用。它通常用于执行清理任务,例如关闭数据库连接或释放资源。
是的,您可以在 PHP 中将魔术方法与静态方法一起使用。__callStatic()
魔术方法在调用不可访问或类中不存在的静态方法时会自动触发。
PHP 中的预定义常量通常用于获取有关 PHP 环境的信息或控制某些函数的行为。例如,PHP_VERSION
常量可用于检查 PHP 版本,PHP_OS
常量可用于检查操作系统。
是的,您可以在 PHP 中重写魔术方法。创建子类时,您可以提供自己的魔术方法实现。但是,如果您想调用父类的实现,可以使用 parent
关键字。
以上是PHP中的魔术方法和预定义常数的详细内容。更多信息请关注PHP中文网其他相关文章!