常量
常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。
常量的定义
常量呢,其实就是变量的反义词,你也可以叫它“不变量”,我们一般都会用常量来作为数据计算中固定的数值。比如:地球重力 G=9.80665,框架的根目录、程序的版本号等都是一个常量。在 PHP 中,你可以在任意的地方定义一个常量。和变量的定义方法不同的是,定义常量你需要用到 define()
内置函数,它的用法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
还记得上节课讲过的“伪类型”变量吗?以上代码说明,函数 define 一共需要三个参数,前两个必传,后一个可以省略。他们分别是:常量名称、常量的值和是否大小写敏感(默认为不敏感)。所以,我们可以参考以下定义常量的方式来定义常量:
<?php
// 合法的常量名
define("WOWPHP", "something");
define("WOWPHP2", "something else");
define("WOWPHP_BAR", "something more");
// 非法的常量名
define("2WOWPHP", "something");
// 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头)
// 也许将来有一天PHP会定义一个__WOWPHP__的魔术常量
// 这样就会与你的代码相冲突
define("__WOWPHP__", "something");
可以看出,常量的命名规则和变量的命名规则是一样的。按照惯例,常量的名称均为大写,这是 PSR 的代码规范,还请大家遵循。
常量的使用
定义好了常量如何使用呢?和变量的用法也有一点儿不同。由于常量的声明没有用到 $
符号,所以你可以直接使用常量的名字即可,前后不必加任何修饰符(包括引号)。像这样:
<?php
// 输出刚才定义好的 WOWPHP 常量
echo WOWPHP;
// 错误的使用方式
echo 'The value is WOWPHP';
// 正确的使用方式
echo 'The value is' . WOWPHP;
如果你不确定某个常量有没有被定义,可以使用 defined
函数来判断,像这样:
<?php
// 注意这里的判断中需要加引号哟
if (defined('WOWPHP')) {
echo WOWPHP;
}
常量的特性
如果有不需要再程序运行过程中需要改变的值,试试常量吧。除了上文说到的,常量还有以下特点:
- 常量的作用域是全局的,可以在脚本的任何一个地方使用。
- 虽然常量和变量都是 PHP 的数据储存单元,但是常量的解析速度要比变量快一些。
- 常量可以避免因为赋值错误或失误带来的运行错误。
如果在程序中使用了一个没有声明的常量,那么你使用的这个常量名称将会被 PHP 解析为一个普通字符串,而且会比直接使用字符串慢 8 倍左右,所以在声明字符串时一定要使用单引号或双引号;在使用常量时最好先判断该常量存不存在。
常量与变量的区别
- 常量面前没有
$
符号。 - 常量只能通过
define
函数来定义,不可直接赋值。 - 常量可以不必理会变量的生效范围规则,而可以在任何地方定义和使用。
- 常量一旦定义就不可再次定义或删除,脚本运行结束后会自动释放。
- 常量只能是标量(boolean、integer、float、和string)这四种类型之一。
注意:在 PHP7 之后,常量已经可以支持 array 类型的值来声明了。
常见的系统内置常量
系统为我们准备了一些内置的常量。这些常量都是规定好的。如下:
常量名 | 说明 |
---|---|
LINE | 当前所在的行 |
FILE | 当前文件在服务器的路径 |
FUNCTIOIN | 当前函数名 |
CLASS | 当前类名 |
METHOD | 当前成员方法名 |
PHP_OS | PHP运行的操作系统 |
PHP_VERSION | 当前PHP的版本 |
TRAIT | Trait 的名字,php5.4新加 |
DIR | 文件所在的目录 |
NAMESPACE | 当前命名空间的名称(区分大小写) |