前言
常量的介绍
在"常量"的广义概念是:'不变化的量'(例如:在计算机程序运行时,不会被程序修改的量;数学函数中的某一个量,例如每一个具体的圆的半径、直径数值;物理学中的靠近地面的重力加速度;真空中的光速数值;不同的微粒的各自的质量)换言之,常量,在计算机技术方面虽然是为了硬件、软件、编程语言服务,但是它并不是专门为硬件、软件、编程语言而引入的概念。常量可区分为不同的类型,如:25、0为整型常量,6.8为实型常量,'a'、'b'为字符常量。常量一般从其字面形式即可判断。这种常量称为字面常量或直接常量。对于'常量'的通俗比喻--"如同大山不被轻而易举地改变"(当然,地球上的重力加速度到海枯石烂也会改变;而人们使用的常量是时间不很漫长的那一段时期基本上不会改变的量。而真空状态中的光速是常量理论上不可改变,是常量)
在PHP中有常量和变量两个概念,常量是相对于变量来说的。常量一般用于一些数据计算中固定的数值, 例如数学的π= -3.141 592....可以定义为常量。常量是一个简单值的标识符,正如其名,在脚本执行期间一个常量一旦被定义, 就不能再改变或者取消定义。常量的作用域是全局的,可以在脚本的任何地方声明和访问到常量,这也是在应用上我们经常选择使用常量的主要原因。另外,虽然常量和变量都是PHP的存储单元,但常量声明的类型只能是标量数据( boolean、integer、 float 和string )。其实对于整型这种简单的数据类型常量来说,要比声明变量效率高一点,也节约空间。如果是复杂数据类型,例如字符串,效率就差不多。另外,常量可以避免因为错误或失误赋值而带来的运行错误,所以如果有不需要在程序运行过程中改变的量,我们首选常量。总之,在PHP中常量非常多见,不仅可以自定义常量使用,更主要的是几乎在每个PHP扩展中都默认提供了大量可使用的常量,而且PHP也提供了一些比较实用的魔术常量。
常量的定义和基本使用
声明常量和声明变量的方式是不同的,在PHP中是通过define()函数来定义常量.常量的命名与变量相似,也要遵循与变量相似,也要遵循PHP标识符的命名规则。另外,声明常量默认还跟变量一样大小写敏感,按照惯例常量名称总是大写的,但是不要在常量前面加上“$” 符号。
define0函数的格式如下:
boolean define(string name,mixedvalue[,bool case insensitive]) ; //常量定义函数
此函数的第一个 参数为字符串类型的常量名,第二个参数为常量的值或是表达式,第三个参数是可选的。如果把第三个参数case_ insensitive 设为TRUE,则常数将会定义成不区分大小写。预设是区分大小写的。如果只想检查是否定义了某个常量,则用defined()函数。
常量的声明与使用:
define("TEST_INT", 100); //声明一个名TEST_INT的常量 值为100//打印输出echoTEST_INT; echo'<br>'; define("TEST_FLOAT", 88.88); //声明一个名TEST_FLOAT的常量 值为浮点数88.88//打印输出echoTEST_FLOAT; echo'<br>'; define("TEST_BOOL", true); //声明一个名TEST_BOOL的常量 值为true(布尔值)//打印输出echoTEST_BOOL; echo'<br>'; define("TEST_STRING", "李白"); //声明一个名TEST_STRING的常量 值为字符串:李白//打印输出echoTEST_STRING; echo'<br>'; define("TEST_STR", "李白", true); //声明一个名TEST_STRING的常量 值为字符串:李白 ,不区分大小//打印输出echoTEST_STR; echo'<br>'; echoTEST_STR; echo'<br>判断常量是否被定义<br>'; //判断一个常量是否被定义if(defined('TEST_STR')){ echoTEST_STR; }
执行结果如下:
使用一个没有声明的常量常量名称会被解析为一个普通字符串,会比直接使用字符串慢将近8倍左右,所以在声明字符串时一定要加上单引号或双引号
常量与变量的区别
- 常量前面没有美元符号 ($)
- 常量只能用 define()函数定义,而不能通过赋值语句定义
- 常量可以不用理会变量范围的规则而在任何地方定义和访问
- 常量一旦被定义就不能被重新定义或者取消定义,直到脚本运行结束自动释放。常量的值只能是标量( boolean、integer、 float 和string这4种类型之一)
系统中的PHP预定义的常量
在PHP中,除了可以自己定义常量,PHP本身还预定义了一系列系统常量, 可以在程序中直接使用来完成一些特殊的功能。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才可使用,或者动态加载后,或者在编译PHP时已经包括进去了。这些分布在不同扩展模块中的预定义常量有多种不同的开头,决定了各种不同的类型。PHP内置一些在系统中常见的预定义常量如下:
PHP_OS:
常量值:UNIX或者WINNT等
作用:执行解析的操作系统名称
PHP_VERSION:
常量值:7.2.12等等
作用:当前PHP的版本
TRUE:
常量值:TRUE
作用:代表布尔值,真
FALSE:
常量值:FALSE
作用:代表布尔值,假
NULL:
常量值:NULL
作用:代表空值
DIRECTORY_SEPARATOR:
常量值:/或者\
作用:根据操作系统决定目录分隔符
PATH_SEPARATOR:
常量值:;或:
作用:根据操作系统决定环境变量的目录列表分隔符
E_ERROR:
常量值:1
作用:错误,导致PHP脚本运行终止
E_WARNING:
常量值:2
作用:警告,会有提示,不会导致PHP脚本终止运行
E_PARSE:
常量值:4
作用:解析错误,由程序解析器报告
E_NOTICE:
常量值:8
作用:非关键的错误,比如:变量未初始化等
M_PI:
常量值:3.1415926535898
作用:数学中π的值
echoPHP_VERSION;
执行结果:
PHP中除了预定义常量还有魔术常量,下面接着了解魔术常量具体内容
PHP中的魔术常量
PHP中还有8个常量会根据它们使用的位置改变而改变,这样的常量在PHP中被称为:魔术常量。比如:__LINE__的值就依赖于它在脚本中所处的行来决定.而且这些特殊的常量不区分大小写.具体如下:
__FILE__:
常量值:当前的文件名
作用:默认常量,是指PHP程序文件名及路径;在哪个文件中使用,就代表哪个文件名称
echo'该文件位于: " ' . __FILE__ . ' " ';
__DIR__:
常量值:当前所在的目录
作用:文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
echo'该文件位于: " ' . __DIR__ . ' " ';
__LINE__:
常量值:当前的行数
作用:默认常量,是指PHP程序的行数;在代码的哪行使用,就代表哪行的行号
echo'这是第 " ' . __LINE__ . ' " 行';
__CLASS__:
常量值:当前的类名
作用:类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。:在哪个类中使用就代表哪个类的类名
classtestClazz { functionout() { echo'类名为:' . __CLASS__ . "<br>"; echo'对象的方法名为:' . __METHOD__ ; } } $test=newtestClazz(); $test->out();
结果:
类名为:testClazz
对象的方法名为:testClazz::out
__TRAIT__:
常量值:Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
作用:Trait 的名字(PHP 5.4.0 新加)。代码块:自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
classParentClazz { publicfunctiontest() { echo'test'; } } traittestTrait { publicfunctiontest() { parent::test(); echo'Trait'; } } classChildextendsParentClazz { usetestTrait; } $obj=newChild(); $obj->test();
__METHOD__:
常量值:当前对象的方法名
作用:类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。在对象中的哪个方法中使用就代表哪个方法名
functiontestMethod(){ echo'方法名为:' . __METHOD__ ; } testMethod();
__FUNCTION__:
常量值:当前的函数名
作用:在哪个函数中使用就代表哪个函数名
functiontestphp(){ echo'函数名为:' . __FUNCTION__ ; } testphp();
__NAMESPACE__:
常量值:当前命名空间的名称(区分大小写)
作用:当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
<?php namespace MCProject; echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MCProject" ?>
注:魔术变量两边是双下划线,也是是说是两个下划线连在一起:"__",PHP中还有魔术方法虽然只有左边有下划线,但同样是双下划线
代码实践
预定义和魔术常量的基本用法如下:
echo"当前文件的路径:".__FILE__; echo"</br>当前的行数:".__LINE__; echo"</br>当前PHP的版本信息:".PHP_VERSION; echo"</br>当前的操作系统:".PHP_OS;
执行结果如下: