> For the complete documentation index, see [llms.txt](https://phper.shujuwajue.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://phper.shujuwajue.com/ji-chu/shu-ju-lei-xing-he-chang-liang.md).

# 数据类型和常量

> 在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：返回圆周率π的值。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://phper.shujuwajue.com/ji-chu/shu-ju-lei-xing-he-chang-liang.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
