# **PHP简明手册**
## **变量 和 常量**
> 1. 变量和常量是PHP中最基本的数据存储单元,它们可以存储不同类型的数据;
> 2. PHP的变量或常量的数据类型由程序的上下问决定,跟强类型语言(如:C等)由很大不同!
--------------------------------------------------------------------------------
### 什么是变量?
1. 变量是用于临时存储值的容器;
2. 这些值可以是数字、文本,或者复杂得多的排列组合;
3. 变量又是指在程序的运行过程中随时可以发生变化的量,是程序中数据临时存放的场所;
4. 简而言之:变量是用于跟踪几乎所有类型信息的简单工具!
5. PHP 中的变量是用一个美元符号($)后面跟变量名来表示,变量名是区分大小写的。
- 变量名与PHP中其它的标签一样遵循相同的规则,一个有效的变量名由字母或下划线开头,后面跟上任意数量的字母、数字、或者下划线
- 按照正则表达式来表述php变量名 `[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*`
- $this 是一个特殊的变量,它不能被赋值
- php 提供了大量的预定义变量
- 许多变量依赖于运行的服务器的版本和设置,及其它因素
--------------------------------------------------------------------------------
### 什么式常量?
1. 常量是用于一些数据计算中固定的数值;
2. 常量是一个简单值的标识符(名字);
3. 常量申明的类型只能是标量数据(`boolean` `integer` `float` `string`);
4. 在程序执行期间一个常量一旦被定义,就不能再改变或者取消定义(除了所谓的魔术常量,它们其实不是常量);
5. 常量默认为大小写敏感。传统上常量标识符总是大写的。
- 按照正则表达式来表述php常量名 `[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*`
6. 常量的作用于是全局的(这是用它的主要原因)
- 可以在脚本的任何地方什么和访问到常量
7. PHP 中可以用 `define()` 函数来定义常量:
- php 5.3 以后可以使用const关键字在类定义之外定义常量
- php 中常量不仅可以自定义,而且php默认提供了大量预定定义常量
- php 中也提供的一些比较实用的 魔术常量(它们其实不是常量)
--------------------------------------------------------------------------------
### 常量与变量有哪些区别?
1. 常量前面没有美元符号($);
2. 常量只能使用 `define()` 函数定义,而不能通过赋值语句;
3. 常量可以不用理会变量的作用域,而在任何地方定义和访问;
4. 常量一旦定义就不能被重新定义或取消定义;
5. 常量的值只能是标量(`boolean` `integer` `float` `string`);
--------------------------------------------------------------------------------
### **变量的范围**
> 1. 变量的范围也就是它的生效范围
> 2. 大部分的 php 变量只有一个单独的使用范围,包含了 `include` `require` 引入的文件;
> 3. 当一个变量执行赋值动作后,会随着申明区域位置的差异而有不同的使用范围;
> 4. 大致上来说:变量会依据申明的位置分为局部变量和全局变量两种。
#### **局部变量**
1. 局部变量也称内部变量,是在函数内部申明的变量;
- 作用域仅限于函数内部,离开该函数后再使用这种变量是非法的
2. 为申明函数设置的参数因为只能在本函数的内部使用,所以也是局部变量;
- `func_test("参数1", "参数2");`
- 函数的参数具体数值从函数外部获得(函数被调用传入的值),作用域仅限于函数内部
- 直接在函数中申明的变量只能在内部被赋值,作用域仅限于函数内部
3. 每次函数被调用时,函数内部的变量才被申明,执行完毕后函数内部的变量都被释放。
#### **全局变量**
1. 全部变量也称外部变量,是在函数外部定义的;
- 作用域:从变量定义出开始,到本程序文件的末尾
2. php中的全局变量与其它变成语言不同
- 在php中,由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,因此在函数中无法直接调用全局变量
3. 函数如何使用全局变量?
- 在函数内部利用 `global` 关键字定义指定的全局变量:
```php
- `预定义变量` 又称 `超全局变量` `超全局数组`
> - 超全局数组(变量),在PHP的脚本中,已经申明完成的变量,你可以直接就去使用即可!变量的名字已经规定好的了
> - 对于全部脚本而言, PHP提供了大量的预定义变量。这些变量将所有的 `外部变量(包括来自 PHP 之外的变量,如表单提交 )` 表示成内建环境变量,并且将错误信息表示成返回头。
预定义变量名 | 预定义变量值 | 说明
----------- | --------------- | --------------------------------------------------------------------------------------------------------------
`$GLOBALS` | 引用全局作用域中可用的全部变量 | 一个包含了全部变量的全局组合数组,变量的名字就是数组的键
`$_SERVER` | 服务器和执行环境信息 | 一个包含了诸如头信息(header)、路径(path)以及脚本位置等信息的数组
`$_GET` | HTTP GET 变量 | 通过 `URL` 参数传递给当前脚本的变量的数组
`$_POST` | HTTP POST 变量 | 当HTTP POST请求的 `Content-Type` 是 `application/x-www-form-urlencoded` 或 `multipart/form-data` 时,会将变量以关联数组形式传入当前脚本
`$_FILES` | HTTP 文件上传变量 | 通过 `HTTP POST` 方式上传到当前脚本的项目的数组
`$_COOKIE` | HTTP Cookies | 通过 `HTTP Cookies` 方式传递给当前脚本的变量的数组
`$_SESSION` | Session 变量 | 当前脚本可用 `SESSION` 变量的数组
`$_REQUEST` | HTTP Request 变量 | 默认情况下包含了 `$_GET` `$_POST` 和 `$_COOKIE`的数组
`$_ENV` | 环境变量 | 通过环境方式传递给当前脚本的变量数组
--------------------------------------------------------------------------------
### **PHP 中常见的预定义常量**
1. 在 PHP 中,除了可以自己定义常量,还预定义了一系列系统常量,可以在程序中直接使用来完成一些特殊功能;
2. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现:
- 或者动态加载后
- 或者在编译 PHP 时已经包括进去了
- 这些分布在不同扩展模块中的预定义常量有多种不同的开头,决定了各种不同的类型
const name | const value | const info
------------------------- | ------------------- | ---------------------
`__PHP_OS__` | `UNIX` OR `WINNT` | 执行PHP解析的操作系统名称
`__PHP_VERSION__` | 5.2.6 | 当前 PHP 服务器的版本
`__TRUE__` | TURE | 代表布尔值, 真
`__FALSE__` | FALSE | 代表布尔值, 假
`__NULL__` | NULL | 代表空值
`__DIRECTORY_SEPARATOR__` | `\` OR `/` | 根据操作系统决定目录的分隔符
`__PATH_SEPARATOR__` | `;` OR `:` | 根据操作系统决定环境变量的的目录列表分隔符
`__E_ERROR__` | 1 | 错误,导致 PHP 脚本运行终止
`__E_WARNING__` | 2 | 警告,不会导致 PHP 脚本运行终止
`__E_PARSE__` | 4 | 解析错误,有程序解析器报告
`__E_NOTICE__` | 8 | 非关键的错误,例如变量未初始化
`__M_PI__` | 3.141 592 653 589 8 | 数学中的 π
--------------------------------------------------------------------------------
### **PHP 中的魔术常量**
1. php 中还有几个常量会根据它们使用的位置而改变,这样的常量在 php 中被称为 `魔术常量` ;
2. php `魔术常量` 不区分大小写
常量名 | 常量值 | 说明
--------------- | --------- | ---------------------
`__FILE__` | 当前的文件名 | 在哪个文件中使用,就代表哪个文件名称
`__LINE__` | 当前的行数 | 在代码的哪行使用,就代表哪行的行号
`__FUNCTION__` | 当前的函数名 | 在哪个函数中时间,就代表哪个函数名
`__CLASS__` | 当前的类名 | 在哪个类中使用,就代表哪个类的类名
`__METHOD__` | 类下面的当前方法名 | 在类下面的哪个方法中使用,就代表这个方法名
`__DIR__` | 当前目录名 | 在哪个文件下使用,就代表哪个文件名
`__TRAIT__` | 不常用 | 不常用
`__NAMESPACE__` | 当前命名空间名 | 当前命名空间的名称
--------------------------------------------------------------------------------