# 常量
## 基本介绍
* 常量的定义是一个无法更改其值的变量。
* 常量名以字符或下划线开始,后面跟随任意数量的字母、数字、下划线。
* 常量名中的字母建议都是大写字母。
* 与变量不同,不应该在常量前面加`$`美元符号。
* 可以通过`define()`函数来定义常量。
* 可以通过`defined()`函数来检查是否定义了某常量。
* 可以通过`const`关键字来定义常量,但类里面不允许,这里官方文档有点错乱,看下面介绍:
1. 在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量,链接:http://php.net/manual/zh/language.constants.syntax.php
2. 可以把在类中始终保持不变的值定义为常量,链接:http://php.net/manual/zh/language.oop5.constants.php
* 使用 `const` 关键字定义常量必须处于代码库最顶层的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 `const` 来定义常量。
* 常量只能包含标量数据(boolean,integer,float,string),还可以定义resource常量,但应尽量避免,除非你有准备好迎接突如其来的BUG。
* 通过`get_defined_constants()`函数可以获取所有已定义的常量。
* 常量和全局变量在不同的作用范围(命名空间)里,所以无法将常量用于可变变量。
* 如果在某个地方使用了一个未定义的函数,PHP会自动将其加上引号转成字符串,同时发出警告错误。
## 和变量不同之处
* 常量前面没有美元符号($)
* 常量只能用 `define()`函数 或 `const`关键字来定义,而不能通过赋值语句。
* 常量可以不用理会作用域的概念,它可以在任何地方定义和访问。
* 常量一旦定义就不能更改它的值或是删除。
* 常量的值只能是标量类型。
## 魔术常量
* 魔术常量的名称通常由两个下划线作为前后缀,由PHP或扩展提供,通常在你想要使用之前它们就已经定义好了。
* 有八个特殊的魔术常量他们的值会随着代码而决定,而且还不区分大小写,如下:
* `__LINE__`:文件中的当前行号。
* `__FILE__`:当前文件的绝对路径。
* `__DIR__`:当前目录的绝对路径。
* `__FUNTION__`:当前函数名称。
* `__CLASS__`:当前class类的名字。
* `__TRAIT__`:trait的名字。
* `__METHOD__`:当前类的方法名。
* `__NAMESPACE__`:当前命名空间的名称。
* 还有很多PHP系统预定义的常量,参考链接:http://php.net/manual/zh/reserved.constants.php