# 数据类型和常量

> 在PHP中，存在8种变量类型，分为三类
>
> * 标量类型： boolean、integer、float(double)、string
> * 复合类型： array、object
> * 特殊类型： resource、NULL

## 浮点类型

浮点类型不能运用到比较相等运算

举例：

```php
$a = 0.1;
$b = 0.7;
$c = $a + $b;

if($a + $b == 0.8){
    echo 'true1';
}

if($c == 0.8){
    echo 'true2';
}

$a = 1;
$b = 7;
if($a+$b == 8){
    echo 'true3';
}
```

结果：

```
true3
```

结果只输出了整型的计算比较。

为什么浮点数计算会有问题，因为`$a+$b`是交给cpu进行计算，cpu计算时只能转成二进制，转二进制时浮点数就会有一定的损耗，所以`$a+$b`，最终就不在是0.8,导致判断有问题。

## 布尔类型

**false的7种情况：**&#x20;

* 整型0
* 浮点`0.0`(当然`0.000`也都算)
* 布尔`false`
* 空字符串
* 0字符串：\`'0'
* 空数组：`array()`
* NULL

## 数组类型

超全局数组

* $GLOBALS - 引用全局作用域中可用的全部变量（包含后面所有的数据）
* $\_SERVER - 保存关于报头、路径和脚本位置的信息。
* $\_REQUEST - 用于收集 HTML 表单提交的数据（包含$\_GET,$\_POST数据和$\_COOKIE数据）。
* $\_POST
* $\_GET
* $\_FILES
* $\_ENV
* $\_COOKIE
* $\_SESSION

示例：

访问url：`http://127.0.0.1/test.php/user/reg?status=open`

```php
echo 'SERVER_ADDR:' . $_SERVER['SERVER_ADDR'] . '<br>';
echo 'SERVER_NAME:' . $_SERVER['SERVER_NAME'] . '<br>';
echo 'REQUEST_TIME:' . $_SERVER['REQUEST_TIME'] . '<br>';
echo 'QUERY_STRING:' . $_SERVER['QUERY_STRING'] . '<br>';
echo 'HTTP_REFERER:' . isset($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'] . '<br>';
echo 'HTTP_USER_AGENT:' . $_SERVER['HTTP_USER_AGENT'] . '<br>';
echo 'REMOTE_ADDR:' . $_SERVER['REMOTE_ADDR'] . '<br>';
echo 'REQUEST_URI:' . $_SERVER['REQUEST_URI'] . '<br>';
echo 'PATH_INFO:' . $_SERVER['PATH_INFO'] . '<br>';
```

结果：

```
SERVER_ADDR:127.0.0.1
SERVER_NAME:127.0.0.1
REQUEST_TIME:1504965126
QUERY_STRING:status=open
HTTP_USER_AGENT:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36
REMOTE_ADDR:127.0.0.1
REQUEST_URI:/test.php/user/reg?status=open
PATH_INFO:/user/reg
```

> 为什么使用$\_SERVER\['HTTP\_REFERER']会出现这个报错的原因。
>
> 我们大家都知道$\_SERVER\['HTTP\_REFERER']用来获取当前页面的上一个页面地址，只有上一个页面存在，$\_SERVER\['HTTP\_REFERER']才会被设置，如果没有上一个页面（比如用户直接在浏览器上输入当前页面地址打开页面，这时候就没有上一个页面了），$\_SERVER\['HTTP\_REFERER']变量不会被设置。所以在使用这个变量时会报错。

下表列出了您能够在 $\_SERVER 中访问的最重要的元素：

| 元素/代码                               | 描述                                                                          |
| ----------------------------------- | --------------------------------------------------------------------------- |
| $\_SERVER\['PHP\_SELF']             | 返回当前执行脚本的文件名。                                                               |
| $\_SERVER\['GATEWAY\_INTERFACE']    | 返回服务器使用的 CGI 规范的版本。                                                         |
| $\_SERVER\['SERVER\_ADDR']          | 返回当前运行脚本所在的服务器的 IP 地址。                                                      |
| $\_SERVER\['SERVER\_NAME']          | 返回当前运行脚本所在的服务器的主机名（比如 [www.w3school.com.cn）。](http://www.w3school.com.cn）。) |
| $\_SERVER\['SERVER\_SOFTWARE']      | 返回服务器标识字符串（比如 Apache/2.2.24）。                                               |
| $\_SERVER\['SERVER\_PROTOCOL']      | 返回请求页面时通信协议的名称和版本（例如，“HTTP/1.0”）。                                           |
| $\_SERVER\['REQUEST\_METHOD']       | 返回访问页面使用的请求方法（例如 POST）。                                                     |
| $\_SERVER\['REQUEST\_TIME']         | 返回请求开始时的时间戳（例如 1577687494）。                                                 |
| $\_SERVER\['QUERY\_STRING']         | 返回查询字符串，如果是通过查询字符串访问此页面。                                                    |
| $\_SERVER\['HTTP\_ACCEPT']          | 返回来自当前请求的请求头。                                                               |
| $\_SERVER\['HTTP\_ACCEPT\_CHARSET'] | 返回来自当前请求的 Accept\_Charset 头（ 例如 utf-8,ISO-8859-1）                           |
| $\_SERVER\['HTTP\_HOST']            | 返回来自当前请求的 Host 头。                                                           |
| $\_SERVER\['HTTP\_REFERER']         | 返回当前页面的完整 URL（不可靠，因为不是所有用户代理都支持）。                                           |
| $\_SERVER\['HTTPS']                 | 是否通过安全 HTTP 协议查询脚本。                                                         |
| $\_SERVER\['REMOTE\_ADDR']          | 返回浏览当前页面的用户的 IP 地址。                                                         |
| $\_SERVER\['REMOTE\_HOST']          | 返回浏览当前页面的用户的主机名。                                                            |
| $\_SERVER\['REMOTE\_PORT']          | 返回用户机器上连接到 Web 服务器所使用的端口号。                                                  |
| $\_SERVER\['SCRIPT\_FILENAME']      | 返回当前执行脚本的绝对路径。                                                              |
| $\_SERVER\['SERVER\_ADMIN']         | 该值指明了 Apache 服务器配置文件中的 SERVER\_ADMIN 参数。                                    |
| $\_SERVER\['SERVER\_PORT']          | Web 服务器使用的端口。默认值为 “80”。                                                     |
| $\_SERVER\['SERVER\_SIGNATURE']     | 返回服务器版本和虚拟主机名。                                                              |
| $\_SERVER\['PATH\_TRANSLATED']      | 当前脚本所在文件系统（非文档根目录）的基本路径。                                                    |
| $\_SERVER\['SCRIPT\_NAME']          | 返回当前脚本的路径。                                                                  |
| $\_SERVER\['SCRIPT\_URI']           | 返回当前页面的 URI。                                                                |

## NULL

三种null情况

* 直接赋值为NULL
* 未定义的变量
* unset销毁的变量

```php
<?php

$a;
var_dump($a);
var_dump($b);
$c = 'c';
unset($c);
var_dump($c);
```

结果

```
null
null
null
```

> 注意如果错误级别高的话，会提示notice错误，关闭掉 NOTICE错误的警告 error\_reporting(E\_ALL ^ E\_NOTICE);

**null的特殊性**

1. 递减NULL 没有效果,還是null
   1. 递增NULL值为1
2. 当变量为null值，像数组一样取键值不会报错

```
$result = null;
//$result = array($result); // Notice: Undefined index: city ....
echo $result['city'];
```

## 常量

**两种定义方式：**

* const
* define

const 是语言结构，define是函数，所以const更快

**区别与共同：**  <br>

* define不能用于类常量，const可以
* 常量一经修改，不能被修改，不能被删除

**魔术常量：**

PHP中有八个魔术常量，它们的值会随着它们在代码中的位置的改变而改变。这些特殊的常量不区分大小写。

* **\_\_LINE\_\_**：返回文件中的当前行号。也可写成\_\_line\_\_。
* **\_\_FILE\_\_**：返回当前文件的绝对路径（包含文件名）。
* **\_\_DIR\_\_**：返回当前文件的绝对路径（不包含文件名），等价于 dirname(\_\_FILE\_\_)。
* **\_\_FUNCTION\_\_**：返回当前函数（或方法）的名称。
* **\_\_CLASS\_\_**：返回当前的类名（包括该类的作用区域或命名空间）。
* **\_\_TRAIT\_\_**：返回当前的trait名称（包括该trait的作用区域或命名空间）。
* **\_\_METHOD\_\_**：返回当前的方法名（包括类名）。
* **\_\_NAMESPACE\_\_**：返回当前文件的命名空间的名称。

**预定义常量：**

**内核预定义常量：是在PHP的内核中就定义好了的常量。区分大小写。**

PHP\_VERSION：返回PHP的版本。

PHP\_OS：返回执行PHP解释器的操作系统名称。

PHP\_EOL：系统换行符，Windows是（\r\n），Linux是（\n），MAC是（\r）。

**标准预定义常量：PHP默认定义的常量。区分大小写。**

M\_PI：返回圆周率π的值。
