常量是一个简单值的标识符(名字),如同其名称所暗示的,在脚本执行期间该值不能改变(除了魔术常量,它们其实不是常量)。常量标识符默认为大小写敏感,按照约定俗成其标识符通常使用全大写。常量标识符前不加 $ 符号。
常量只能包含标量数据(integer、float、string 和 boolean)。可以定义 resource 常量,但应尽量避免,因为会造成不可预料的结果。
PHP 中有两种定义常量的方式:一种是使用 const,另一种是使用 define 。
示例1(const):
<?php
const CON1=3;
const CON2=3.14;
const CON3='This is a const.';
const CON4=false;
echo CON1.'<br/>'; //3
echo CON2.'<br/>'; //3.14
echo CON3.'<br/>'; //This is a const.
var_dump(CON4); //boolean(false)
?>
示例2(define):
<?php
define('CON1',3);
define('CON2',3.14);
define('CON3','This is a const.');
define('CON4',false);
echo CON1.'<br/>'; //3
echo CON2.'<br/>'; //3.14
echo CON3.'<br/>'; //This is a const.
var_dump(CON4); //boolean(false)
?>
需要注意的一点是:常量一经定义,不能被修改,也不能被删除。
示例3:
<?php
const CON1=3.14;
const CON1=3.1;
echo CON1.'<br/>'; //3.14
define('CON1',3);
echo CON1.'<br/>'; //3.14
define('CON2','test');
define('CON2','tes');
echo CON2.'<br/>'; //test
const CON2='te';
echo CON2; //test
?>
const 是一个语言结构,简单易读;而 define 是一个函数,使用上更灵活多变。而这两种定义常量的方式的主要区别也是围绕该点产生的——
1. define 可以通过第三个参数来指定是否区分大小写,true 表示大小写不敏感,默认为 false;const 不能。
示例4:
<?php
define('CON',3.14,true);
echo CON.'<br/>'; //3.14
echo con; //3.14
?>
2. define 定义的常量名与常量中可以有表达式;const 不能。
示例5:
<?php
for($i=1;$i<4;$i++){
define('CON_'.$i,$i+1);
}
echo 'CON_1 = '.CON_1.'<br/>'; //CON_1 = 2
echo 'CON_2 = '.CON_2.'<br/>'; //CON_2 = 3
echo 'CON_3 = '.CON_3; //CON_3 = 4
?>
3. define 可在其它函数、循环及 if 条件等中使用;const 是在编译时定义,因而不能。
示例6:
<?php
if(true){
define('CON1','test'); //test
}
if(true){
const CON2='test'; // 出错
}
?>
4. const 可用于类常量的定义;define 不能。
示例7:
<?php
class Test1{
const CON='con1';
static function get_const1(){
return self::CON;
}
function get_const2(){
return self::CON;
}
}
echo Test1::CON.'<br/>'; //con1
$test1='Test1';
echo $test1::CON.'<br/>'; //con1
echo Test1::get_const1().'<br/>'; //con1
$obj=new Test1;
echo $obj->get_const1().'<br/>'; //con1
echo $obj->get_const2().'<br/>'; //con1
class Test2 extends Test1{
const CON='con2';
static function get_const1(){
return self::CON;
}
static function get_parent_const(){
return parent::CON;
}
}
echo Test2::CON.'<br/>'; //con2
echo Test2::get_const1().'<br/>'; //con2
echo Test2::get_parent_const(); //con1
?>
5. const 比 define 快很多。