什么是常量?常量是一种简单的标识符,常量也可以理解为值不变的量(如圆周率),常量在定义的时候就需要赋值,一旦常量值被定义后,在脚本执行期间是不能改变的。PHP中的常量分为系统常量和自定义常量。
常量作用
常量主要功效是可以避免重复定义,篡改变量值。在我们进行团队开发时,或者代码量很大的时候,对于一些第一次定义后不改变的量,如果我们使用变量,在不知情的情况下,使用同一变量名时,变量值就会被替换掉,从而会引发服务器执行错误的任务。
此外,使用常量还能提高代码的可维护性。如果由于某些原因,常量的值需要变更时候,我们只需要修改一个地方。例如在做计算中,起初我们取圆周率为3.14,于是很多计算中我们都使用3.14进行计算,当要求计算精度提高,圆周率需要取3.142的时候,我们不得不修改所有使用3.14的代码,倘若代码量比较多时,不仅工作量大,还可能遗漏。
系统常量

PHP提前给大家提供的,拿来就可以直接使用

PHP_VERSION //PHP版本
PHP_OS //PHP的运行系统
PHP_INT_MAX //整型的最大值
PHP_INT_SIZE //整数integer值的字长

自定义常量

TIPS

  1. 常量名称不加$
  2. 常量名称最好大写,以字母或者下划线开
  3. 常量定义之后可以在任意位置使用,常量作用域是全局的
  4. 常量一经定义在脚本执行期间是不能改变的
  5. 常量的值可以是标量类型,也可以是数组
  6. 常量默认区分大小写比如, CONSTANT 和 Constant 代表了不同的值,如果设置为 TRUE,该常量则大小写不敏感。

define()

define (string $name, mixed $value, bool) //定义一个常量
name 常量名
value 常量的值
在PHP5中,value 必须是标量( integer、 float、string、boolean、NULL),在PHP7中还允许是个array的值

实例

<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; //输出 "Hello world."
echo Constant; //输出 "Constant" 并导致 Notice

define("GREETING", "Hello you.", true);
echo GREETING; //输出 "Hello you."
echo Greeting; //输出 "Hello you."

define("USERNAME", "xuxiaoke");
define("AGE", 26);
define("MARRIED", false);
define("SALARY", 3680.666);
define("TEST_ARRAY", array("a", "b", "c"));
echo "用户名为:",USERNAME,"<br/>";
echo "用户年龄为:",AGE,"<br/>";
echo "是否结婚:",MARRIED,"<br/>";
echo "年收入为:",SALARY,"<br/>";
var_dump(TEST_ARRAY);

const

const 关键字定义常量
const NAME=值;
常量一经定义在脚本执行期间是不能改变的>

实例

const WEB_TITLE="许小珂的个人博客";
const WEB_BLOG_URL = "http://www.xuxiaoke.com";
const WEB_ADMIN = "许小珂";

echo WEB_TITLE,"<br/>";
echo WEB_ADMIN,"<br/>";

//通过constant来获取常量的值
echo constant("WEB_BLOG_URL");

检测常量是否存在

defined(name) //检测常量名称是否存在,如果存在返回true,否则返回false

获取所有已定义的常量

get_defined_constants() //返回的是数组,得到所有已定义的常量,包含系统常量和自定义常量

const和define的区别

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

TIPS

  1. const用于类成员变量的定义,一经定义,不可修改
  2. define不可以用于类成员变量的定义,可用于全局常量
  3. const可在类中使用,define不能
  4. const不能再条件语句中定义常量

实例

<?php
if (...){
    const FOO = 'BAR';    // 无效的invalid
}
if (...) {
    define('FOO', 'BAR'); // 有效的valid
}
?>

const只能接受静态的标量,而define可以采用任何表达式
<?php
const BIT_5 = 1 << 5;    // 无效的invalid
define('BIT_5', 1 << 5); // 有效的valid
?>

const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。
<?php
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR
?>

魔术常量

__LINE__ //得到当前的行号
__FILE__ //得到当前文件的完整绝对路径和文件名
__DIR__ //得到当前文件的完整绝对路径
__FUNCTION__ //得到当前函数的名称
__CLASS__ //得到当前函数的类名
__METHOD__ //得到当前类的方法名称
__TRAIT__ //得到当前TRAIT的名称
__NAMESPACE__ //得到当前命名空间的名称