[复习|验证|更新贴]
文档中位置:语言参考/常量/魔术常量
要点:(6)
1. PHP中有7个魔术常量:__LINE__, __FILE__, __DIR__, __FUNCTION__, __CLASS__, __METHOD__, __NAMESPACE__
2. 特殊常量不区分大小写
3. 其值随着它们在代码中的位置改变而改变
4. 如果使用了名字空间,那么显示__FUNCION__,__CLASS__,__METHOD__时,前面会添加名字空间
5. __FILE__ = dirname(__DIR__)
6. __LINE__, __FILE__, __DIR__ 都和当前被包含脚本有关,而不是和包含脚本有关
验证:
目录结构
/hw006
|--a.php
|--b.php
在a.php中包含了b.php
a.php代码如下:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><?php
namespace hw006a; //defined a namespace
//in a.php, deliberately use the "pure lowcase" and "mixture of lowcase and uppercase" ways
echo "__FILE__:", __file__, "<br />";
echo "__LINE__:", __Line__, "<br />"; //5
echo "__DIR__:", __DIR__, "<br />";
echo "__NAMESPCE__", __NAMESPACE__, "<br />";
function testFunc(){
echo "__FUNCTION__:", __FUNCTION__, "<br />";
//if there is a namespace, it will show with the namespace
}
testFunc();
class TestClass{
function __construct(){
echo "__CLASS__:", __CLASS__, "<br />";
echo "__METHOD__:", __METHOD__, "<br />";
}
}
new TestClass();
/*require b.php*/
echo "<hr />";
require 'b.php';
?></span></span>
b.php代码如下
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><?php
namespace hw006b; //defined a namespace
echo "__FILE__:", __FILE__, "<br />";
echo "__LINE__:", __LINE__, "<br />"; //5
echo "__DIR__:", __DIR__, "<br />";
echo "__NAMESPCE__", __NAMESPACE__, "<br />";
function testFunc(){
echo "__FUNCTION__:", __FUNCTION__, "<br />";
//if there is a namespace, it will show with the namespace
}
testFunc();
class TestClass{
function __construct(){
echo "__CLASS__:", __CLASS__, "<br />";
echo "__METHOD__:", __METHOD__, "<br />";
}
}
new TestClass();
?></span></span>
访问b.php结果如下:
图1-1
访问a.php结果如下:
图1-2
在a.php中,我使用了名字空间hw006a, 并且故意使用了魔术常量的小写模式、大小写混合模式。从图1-1的结果来看,验证了要点2,4的正确性
另外图1-1水平分割线以下的部分和图1-2验证了要点3,6的正确性
应用:
#1 魔术常量__FILE__或__DIR__ 结合$GLOBALS , DIRECTORY_SEPARATOR 以及函数define(),explode()等等
可以总结出一套可复用的基于绝对路径的PHP文件包含机制(待完成[探索|代码复用贴])
#2 魔术常量 __FUNCTION__可以在递归函数中使用,以防止此递归函数改名时,修改大量代码。
[Changelogs]
2015/01/03 创建此贴,总结出魔术常量比较实用的6大要点,使用一个简单的示例验证了魔术常量的作用