什么是常量
- 所谓常量就是不能改变的量,PHP 中常量一旦被定义,就不能被修改或取消定义。
- 常量的范围是全局的,不用管作用区域就可以在脚本的任何地方访问常量。
- PHP 常量数据只能是四种标量数据类型的数据:整型、浮点型、字符串、布尔型,不过从 PHP7 开始常量支持了数组(array)类型。
- 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
常量默认为大小写敏感,传统上常量总是大写的。
用正则表达式: ^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$。
字母指的是 a-z,A-Z,以及从 128 到 255(0x80-0xff)的 ASCII 字符。
常量的定义
在PHP中是通过define()函数来定义常量的。
语法:define(string $name, mixed $value [, bool $case_insensitive = false])
第一个参数为字符串类型的常量名,第二个参数为常量的值或是表达式,第三个参数是可选的。如果把第三个参数\设为TRUE,则常数将会定义成不区分大小写。默认是区分大小写的。
<?php
define('CON_INT',100);#定义一个名为CON_INT的常量,值为100。
echo CON_INT; #运行结果:100
echo con_int; #运行结果:输出字符串con_int,和问题通知。
define('CON_STRING','不区分大小写',true);#定义一个名为CON_STRING的常量,#并且区分大小写
echo CON_STRING; #运行结果:不区分大小写
echo con_string; #运行结果:不区分大小写
如果使用一个没有声明的常量,则常量名称会被解析为一个普通字符串,但会比直接使用字符串慢近8倍,所以在声明字符串时一定要加上单引号或双引号。
如果只想检查是否定义了某个常量,则用defined()函数。
语法:defined(string $name)
其中 $name 为待判断的常量名称,函数会返回一个 bool 类型的值,常量已定义则返回 true,未定义则返回 false。
<?php
define('CON_INT',100);#定义一个名为CON_INT的常量,值为100。
if(defined('CON_INT')){
echo CON_INT;
}
#运行结果:100
除了可以使用 define() 函数之外,还可以使用 const 关键字来定义常量,使用const 关键字声明常量使得代码简单易读。
语法:const 常量名 = 常量值;
<?php
const CONST_INT=100;
常量的取值
想要获取常量的值,除了可以直接使用常量名外,还可以使用 constant() 函数,使用函数和直接使用常量名的效果是一样的。
语法:constant(string $name);
其中 $name 为要获取的常量名称,也可以是存储常量名的变量。如果成功则返回常量的值;如果常量未定义则返回一个 E_WARNING 级别的错误。
<?php
$a='TSET';
define('CON_'.$a,'灵活定义灵活取值');
echo constant('CON_'.$a);
通过上面的示例:如果常量名是动态的,可以用函数constant()来获取常量的值,在使用上要灵活、方便得多。
define() 和 const 对比
-
const在编译时要比define()快很多,因为const 是一个语言结构,define()是一个函数。
-
const不能在条件语句中定义常量
<?php if(true){ const CONSTRING = '不生效'; } if(true){ define('CONSTRING,'生效'); }
-
define()函数声明常量时,常量名用的是一个字符串类型,可以动态拼接组合。所以 define可以采用表达式作为名称,const只能用普通的常量名称。
$a='TEST'; define('DEFINE_'.$a,'灵活定义常量名称'); const CONST_TEST = '普通的常量名称';
-
通过const关键字定义常量时大小写敏感,而用define()函数可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。
PHP预定义常量
预定义常量顾名思义也就是在 PHP 中预先定义好的常量。PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。PHP预定义常量可以在程序中直接使用来完成一些特殊功能。比如当前 PHP 的版本号、当前的操作系统名称等。
- PHP_VERSION:当前 PHP 的版本号;
- PHP_OS:当前的操作系统名称;
- PHP_EOL:系统换行符,Windows 是(\r\n),Linux 是(\n),MAC 是(\r);
- PHP_INT_MAX:当前 PHP 支持的最大整数;
- PHP_INT_MIN:当前 PHP 支持的最小整数;
- PHP_EXTENSION_DIR:PHP 的扩展目录;
- DIRECTORY_SEPARATOR:目录分隔符\ or /;
- TRUE:布尔类型的 true;
- FALSE:布尔类型的 false;
- NULL:Null 值;
- M_IP:数学中的π;
- E_ERROR:1,错误,导致PHP脚本终止运行;
- E_WARNING:2,警告,不会导致PHP脚本终止运行;
- E_PARSE:4,报告解析错误由程序解析器报告;
- E_NOTICE:8,非关键错误,例如变量未初始化;
还有很多让我们在PHP学习中慢慢了解…
PHP魔术常量
PHP 中还有一些预定义的常量,会根据它们使用的位置而改变,这样的常量在 PHP 中被称为“魔术常量”(魔术常量其实不算常量)。魔术常量通常以两个下划线__开头,并以两个下划线__结尾。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。这些特殊的常量不区分大小写,如下:
- __LINE__ :文件中的当前行号。
- __FILE__:文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
- __DIR__: 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。
- __FUNCTION__: 当前函数的名称。匿名函数则为 {closure}。
- __CLASS__: 当前类的名称。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
- __TRAIT__: Trait 的名字。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
- __METHOD__: 类的方法名。
- __NAMESPACE__: 当前命名空间的名称。
扩展
在之前的PHP版本中,必须使用define()函数来定义常量。当PHP5开始支持面向对象时,define()函数是不可以用于类的成员变量声明,所以就引入const关键字仅用于在类中使用,声明成员常量。而在
PHP 5.3.0以后,可以使用const关键字在类的外部定义常量,先前版本const关键字只能在类中使用。
虽然常量也是PHP的存储单元,但常量声明的类型只能是标量数据,(boolean、integer、float和string)。而array类型到PHP 5.6时候才能通过 const 定义,而以前的版本中则不能将数组声明为常量。使用define()函数定义array 类型的常量是PHP 7以后的版本才可以。