常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。常量默认为大小写敏感。传统上常量标识符总是大写的。
我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。常量可以在脚本中使用。
【1】define函数定义常量
在PHP5.3.0之前的版本中,常量只能用 define() 函数定义。之后可以用const关键字
判断常量是否定义用defined()函数。
- 函数用法
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
参数:
name 必选参数,常量名称,通常大写
value必选参数,常量的值,通常标量类型(bool,int,float,string,null)
case_insensitive 小大写不敏感,默认是false。如果设置成true则不敏感
返回值:
成功返回true,失败返回false。
bool defined (string $name)
参数:name常量的名字
返回:定义返回true,未定义返回false
- 举个例子
//合法命名
define('ABC','123');
define('O2O','o2o');
define('_A_','100');
//非法命名
define('1A','1');
//避免以左右两个下划线定义,防止冲突魔术常量
define('__FOO__','function');
// 区分大小写的常量名
define("NAME", "My name is tacks!");
echo NAME; // My name is tacks!
echo Name; // 未定义报错notice
// 不区分大小写的常量名
define("AGE", "20",true);
echo AGE; // 20
echo Age; // 20
//默认全局范围有效
function getName(){
echo NAME;
}
getName();//My name is tacks!
-
如果使用用了一个未定义的常量,如下代码。那么它首先会去判断是否定义bar常量,但是没有定义,报notice错误,但是仍然可以输出,这是因为php自动将裸字符串(没有引号的字符而且不对应任何已知符号)转化一个起值为裸字符串的正常字符串。所以如果没有定义bar,php会自动代替为'bar'。
-
注意:如果使用一个没有声明的常量,则常量名称会被解析一个普通的字符串,但是会比直接使用该字符串慢近8倍左右,所以在声明字符串的时候一定要加上但单引号或者双引号。
//例1
$foo[bar] = 'tacks';
e//ho $foo[bar];//报notice 输出tacks
//例2
echo A;//报notice 输出A
- 那么我们来使用一下defined()函数来判断一下
if(defined('TEST')){
echo TEST;//如果定义则输出
}
- define函数定义的时候,可以有表达式
define('BBB',1+2);
echo BBB;//3
for($i=0;$i<5;$i++){
define('A_'.$i,$i*2);//常量的名是动态的,常量的值也是动态的
}
echo A_4;//8
【2】const关键字
PHP 5.3.0 后支持const关键字,或者说是语言结构。使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。可以在类内和类外定义常量。一般来说const在类内定义常量,define在类外定义常量。
const PLACE = 'China';
echo PLACE;//China 类外定义常量
//if(1){ const A = 1;}#不能再if 语句 循环 函数 中定义
class Person{
const PLACE = 'earth'; //定义类常量
function show(){
echo self::PLACE;
}
}
echo Person::PLACE;
// 自 5.3.0 起
$classname = "Person";
echo $classname::PLACE; //earth 静态获取
// 自 PHP 5.3.0 起
$class = new Person();
$class->show();//earth 通过实例化对象访问方法
echo $class::PLACE; //earth 对象获取类常量
简单说一下const和define的区别:
-
const是一个语言结构 ,define是一个函数,还有第三个参数是否区分大小写;
-
const可以在类中定义,用于类成员常量定义。define不能再类中使用。用与全局变量;
-
const在编译时定义,因此必须处于最顶端的作用域。不能再函数,判断,循环中使用;
-
const只能用确切的常量名,静态常量。define可以有表达式;
【3】constant函数与get_defined_constants函数
constant — 返回一个常量的值
get_defined_constants用来返回所有定义的常量名和值,这个包含php代码创建的,也包括扩展所创建的。
- 函数用法:
constant ( string $name ) : mixed
当你不知道常量名,却需要获取常量的值时,constant() 就很有用了。也就是常量名储存在一个变量里,或者由函数返回常量名。
get_defined_constants ([ bool $categorize = false ] ) : array
返回值:categorize=true的时候是返回多维数组
- 举个例子:
define('AAA','123');
$name = 'AAA';//常量名是动态的
echo constant('AAA');//123 获取常量AAA的值
echo constant($name);//123 相当于动态常量也可以获取的常量AAA的值
define("MAXSIZE", 100);
define("MINSIZE", 0);
var_dump(get_defined_constants(true));//获取多维数组,可以看一下自己定义的常量在最后面user里
/*
...
'user' =>
array (size=3)
'AAA' => string '123' (length=3)
'MAXSIZE' => int 100
'MINSIZE' => int 0
*/
【4】魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
预定义常量也叫做魔术常量。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。要好好记下这些个特殊的常量。
魔术常量 | 说明 |
---|---|
__LINE__ | 文件中的当前行号 |
__FILE__ | 文件的完整路径和文件名 |
__DIR__ | 文件所在的目录,等同于dirname(__FILE__) |
__FUNCTION__ | 函数被定义时名称 |
__CLASS__ | 类的名称 |
__TRAIT__ | trait的名字 |
__METHOD__ | 类的方法名 |
__NAMESPACE__ | 当前命名空间的名称 |
var_dump(__LINE__);
var_dump(__FILE__);
var_dump(__DIR__);
function foo(){
var_dump(__FUNCTION__);
}
class Common{
function get(){
var_dump(__CLASS__);
var_dump(__METHOD__);
}
}
$obj = new Common;
$obj->get();
【5】系统预定义常量
PHP中,除了自己可以定义常量,还预定义了一些系统常量,可以在程序中直接使用来完成一些特殊的功能。不过很多常量是通过扩展库来定义的,只有在加载了这些扩展库时才会出现,或者在动态加载后,或者在编译PHP时已经包括进去了。下面来看一下常见的预定义常量。
var_dump(PHP_OS);//string 'WINNT' (length=5) 操作系统
var_dump(PHP_VERSION);//string '5.5.12' (length=6) PHP版本
var_dump(DIRECTORY_SEPARATOR);//string '\' (length=1) 系统目录分割符
var_dump(E_ERROR);//int 1 错误,导致php脚本运行终止
var_dump(E_WARNING);//int 2警告,不会导致php脚本运行终止
var_dump(E_PARSE);//int 4 解析错误,有程序计解释器报错
var_dump(E_NOTICE);//int 8 非关键报错,提示
var_dump(M_PI);//float 3.1415926535898 数学中的Π