首页 > 技术文章 > PHP常量总结

gaoBlog 2019-01-31 13:05 原文

概念

常量我们可以理解为值不变的量。常量只要被定义了,在程序脚本的其他任何地方都不能改变

因为常量被定义后不能被修改,所以即使重定义常量的值,常量的值也是第一次定义常量时的值

常量不管在哪里被定义,都具有超全局作用域

常量的定义

常量可以通过define()函数const关键字两种形式定义

个人建议,类常量以外的常量定义尽可能使用define

define ( string $name , mixed $value [, bool $case_insensitive = false ] ) 
  case_insensitive可选。默认是false,大小写敏感的。如果设置为 TRUE,该常量则大小写不敏感。
const NAME = VALUE
define (ABC, "1111") ;    //name可以不加引号,但是不建议这样写
define ("
ABC", "1111") ; //define定义常量时推荐常量名带引号
const DEF = "2222"; //const定义常量时,常量名不能带引号

 

define()函数和const的区别

1.在php5.3.0以前,const只用于在类内部定义类常量,而无法在类外部定义常量。

  在php5.3.0以后,const可以在类外部定义常量,但不能在函数,条件语句,循环语句等的{}语句块中定义常量

2.使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数。另外const在编译时要比define快很多。

3.define可以在在函数,条件语句,循环语句等的{}语句块中定义常量,const不可以

4.const可以定义类常量,而define不可以

5.define可以动态设置常量名,const不可以

6.define常量值可以采用任何表达式,而const只能接受静态的标量

7.const定义的常量大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

 

 

 

<?php
$hostname = php_uname('n');
//类外正常定义
const C1 = 1;
define("C2", 2);
//{}语句块内不能使用const,可以使用define
if (true) {
    const C3 = 1;     //错误
    define("C4", 2);
}
for ($i=0; $i<2;$i++) {
    const C5= 1;    //错误
    define("C6", 2);
}

function test () {
    const C7= 1;    //错误
    define("C8", 2);
}

//define可以动态使用常量名,const不可以
//define常量值可以采用任何表达式,而const只能接受静态的标量
const  FOO = 'BAR';
for ($i = 0; $i < 32; ++$i) {
    define('BIT_' . $i, 1 << $i);
    define('HOST_NAME' . $i, 'HOST' .$i);
}
//const可以定义类常量
class Collect_notification {
    const C9= 1;       
    define("C10", 2);    //错误。define不能定义类常量

    function main(){
        const C11= 1;    //错误。{}语句块内不能使用const
        define("C12", 2);
    }
}

 

常量的使用

有两种形式

  1,直接使用名字  

  2,使用constant()函数:constant(“常量名”)函数可以动态地输出不同的常量,在使用上要灵活方便很多

const  FOO = 'BAR';
for ($i = 0; $i < 2; ++$i) {
    define('HOST_NAME' . $i, 'HOST' .$i);
}
echo HOST_NAME0;   //直接使用常量名
echo HOST_NAME1;
for ($i = 0; $i < 2; ++$i) {
    echo constant('HOST_NAME'.$i); //constant()函数动态使用常量 
}

 

 常量与变量的区别

定义形式不同 (常量使用define或者const定义);

使用形式不同(常量不需要 $ 符号);

可变程度不同(常量的值不可改变或者销毁);

作用范围不同(常量具有超全局作用域(函数内外都可直接使用));

可用类型不同(常量只能存储标量类型intfloatstringbool);

 

推荐阅读