# PHP 数据类型

> 原文： [https://zetcode.com/lang/php/datatypes/](https://zetcode.com/lang/php/datatypes/)

在 PHP 教程的这一部分中，我们将讨论数据类型。

计算机程序可以处理数据。 用于各种数据类型的工具是现代计算机语言的基本组成部分。 `data type`是一组值以及对这些值的允许操作。

## PHP 数据类型列表

PHP 具有八种数据类型：

标量类型

*   `bool`
*   `int`
*   `float`
*   `string`

复合类型

*   `array`
*   `object`

特殊类型

*   `resources`
*   `null`

与 Java，C 或 Visual Basic 等语言不同，PHP 中没有提供变量的显式类型定义。 变量的类型在运行时由 PHP 确定。 如果我们将字符串分配给变量，它将变成字符串变量。 稍后，如果我们分配一个整数值，该变量将成为一个整数变量。

## PHP 布尔值

我们的世界建立了双重性。 有天与地，水与火，阴与阳，男人与女人，爱与恨。 在 PHP 中，布尔数据类型是具有以下两个值之一的原始数据类型：`True`或`False`。 这是基本的数据类型。

快乐的父母正在等待孩子的出生。 他们为两种可能性都选择了名称。 如果要成为男孩，他们选择了约翰。 如果要成为女孩，他们会选择维多利亚。

`kid.php`

```php
<?php

$male = False;

$r = rand(0, 1);

$male = $r ? True: False;

if ($male) {
    echo "We will use name John\n";
} else {
    echo "We will use name Victoria\n";
}

```

该脚本使用随机整数生成器来模拟我们的情况。

```php
$r = rand(0, 1);

```

`rand()`函数从给定的整数边界返回一个随机数。 在我们的情况下为 0 或 1。

```php
$male = $r ? True: False;

```

我们使用三元运算符设置`$male`变量。 该变量基于随机`$r`值。 如果`$r`等于 1，则`$male`变量设置为`True`。 如果`$r`等于 0，则`$male`变量设置为`False`。

```php
if ($male) {
    echo "We will use name John\n";
} else {
    echo "We will use name Victoria\n";
}

```

我们打印名称。 `if`命令适用于布尔值。 如果变量`$male`为`True`，则将`"We will use name John"`打印到控制台。 如果其值为`False`，我们将打印另一个字符串。

```php
$ php kid.php 
We will use name Victoria
$ php kid.php 
We will use name John
$ php kid.php 
We will use name Victoria
$ php kid.php 
We will use name Victoria

```

该脚本运行了几次。

以下脚本显示了一些视为`True`或`False`的常见值。 例如，空字符串，空数组，0 被认为是`False`。

`boolean.php`

```php
<?php
class Object {};

var_dump((bool) "");
var_dump((bool) 0);
var_dump((bool) -1);
var_dump((bool) "PHP");
var_dump((bool) array(32));
var_dump((bool) array());
var_dump((bool) "false");
var_dump((bool) new Object());
var_dump((bool) NULL);

```

在此脚本中，我们在布尔上下文中检查一些值。 `var_dump()`函数显示有关变量的信息。 `(bool)`构建体称为转换。 在它的临时上下文中，0 值是一个数字。 在布尔上下文中，它为`False`。 布尔上下文是当我们使用（布尔）强制转换，何时使用某些运算符（否定，比较运算符）以及何时使用`if/else`，`while`关键字时。

```php
$ php boolean.php
bool(false)
bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)

```

这是脚本的结果。

## PHP 整数

整数是实数的子集。 它们写时没有小数或小数部分。 整数落在集合`Z = {...，-2，-1，0，1，2，...}`中。 整数是无限的。

在许多计算机语言中，整数是原始数据类型。 实际上，计算机只能使用整数值的子集，因为计算机的容量有限。 整数用于计算离散实体。 我们可以有 3、4、6 个人，但不能有 3.33 个人。 我们可以有 3.33 公斤。

在 PHP 中，可以使用四种不同的表示法指定整数：十进制，十六进制，八进制和二进制。 八进制值以`0`开头，十六进制以`0x`开头，二进制以`0b`开头。

`notation.php`

```php
<?php

$decimal_var = 31;
$octal_var = 031;
$hexadecimal_var = 0x31;
$binary_var = 0b01001110;

echo "$decimal_var\n";
echo "$octal_var\n";
echo "$hexadecimal_var\n";
echo "$binary_var\n";

```

我们定义了四个变量； 它们每个都有不同的整数符号。

```php
$ php notation.php 
31
25
49
78

```

默认符号是十进制。 脚本以十进制打印这四个数字。

PHP 中的整数具有固定的最大大小。 整数的大小取决于平台。 PHP 具有内置常量，可显示整数的最大大小。

```php
$ uname -mo
x86_64 GNU/Linux
$ php -a
Interactive mode enabled

php> echo PHP_INT_SIZE;
8
php> echo PHP_INT_MAX;
9223372036854775807

```

在我的 64 位 Ubuntu Linux 系统上，整数值为 8 个字节。 最大值是 9223372036854775807。

在 Java 和 C 中，如果整数值大于允许的最大值，则发生整数溢出。 PHP 的工作方式不同。 在 PHP 中，整数变为浮点数。 浮点数具有更大的边界。

`boundary.php`

```php
<?php

$var = PHP_INT_MAX;

echo var_dump($var);
$var++;
echo var_dump($var);

```

我们为`$var`变量分配一个最大整数值。 我们将变量增加一。 `var_dump()`函数转储有关给定变量的信息。

```php
$ php boundary.php 
int(9223372036854775807)
float(9.2233720368548E+18)

```

如前所述，在内部，数字成为浮点值。

在 Java 中，增加后的值为-2147483648。 这是整数溢出一词的来历。 该数字超过顶部并成为可分配给变量的最小负整数值。

如果我们使用整数，那么我们将处理离散实体。 例如，我们将使用整数来计算苹果。

`apples.php`

```php
<?php

# number of baskets
$baskets = 16;

# number of apples in each basket 
$apples_in_basket = 24;

# total number of apples
$total = $baskets * $apples_in_basket;

echo "There are total of $total apples \n";

```

在脚本中，我们计算了苹果的总量。 我们使用乘法运算。

```php
$ php apples.php 
There are total of 384 apples 

```

脚本的输出。

## PHP 浮点数

浮点数表示计算中的实数。 实数测量连续的数量，例如重量，高度或速度。 PHP 中的浮点数可以大于整数，并且可以具有小数点。 浮标的大小取决于平台。

我们可以使用各种语法来创建浮点值。

`floats.php`

```php
<?php

$a = 1.245;
$b = 1.2e3;
$c = 2E-10;
$d = 1264275425335735;

var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);

```

在此示例中，我们有两种表示法的情况，科学家使用它们来表示浮点值。 另外`$d`变量被分配了一个大数字，因此它会自动转换为浮点型。

```php
$ php floats.php 
float(1.245)
float(1200)
float(2.0E-10)
int(1264275425335735)

```

这是上述脚本的示例输出。

根据文档，不应对浮点数进行相等性测试。 我们将举例说明为什么。

```php
$ php -a
Interactive mode enabled

php> echo 1/3;
0.33333333333333
php> $var = (0.33333333333333 == 1/3);
php> var_dump($var);
bool(false)

```

在此示例中，我们比较了两个看起来相同的值，但是它们产生了意外的结果。

假设一个短跑运动员跑了 100m，跑了 9.87s。 他的公里/小时速度是多少？

`sprinter.php`

```php
<?php

# 100m is 0.1 km

$distance = 0.1;

# 9.87s is 9.87/60*60 h

$time = 9.87 / 3600;

$speed = $distance / $time;

echo "The average speed of a sprinter is $speed \n";

```

在此示例中，必须使用浮点值。

```php
$speed = $distance / $time;

```

为了获得速度，我们将距离除以时间。

```php
$ php sprinter.php 
The average speed of a sprinter is 36.474164133739 

```

这是`sprinter`脚本的输出。 36.474164133739 是浮点数。

通常需要舍入浮点数。

`rounding.php`

```php
<?php

$a = 1.4567;

echo round($a, 2) . "\n";
echo round($a, 3) . "\n";

echo sprintf("%0.3f", $a) . "\n" ;

```

In this example, it is necessary to use floating point values.

```php
echo round($a, 2) . "\n";
echo round($a, 3) . "\n";

```

使用`round()`函数，将浮点值四舍五入到两个和三个位置。

```php
echo sprintf("%0.3f", $a) . "\n" ;

```

或者，我们也可以使用`sprintf()`函数，该函数根据指定的格式化字符串对字符串进行格式化。

```php
$ php rounding.php 
1.46
1.457
1.457

```

这是`rounding.php`脚本的输出。

## PHP 字符串

字符串是一种数据类型，表示计算机程序中的文本数据。

由于字符串在每种编程语言中都非常重要，因此我们将为它们专门整整一章。 在这里，我们仅举一个小例子。

`strings.php`

```php
<?php

$a = "PHP ";
$b = 'Perl';

echo $a, $b;
echo "\n";

```

我们可以使用单引号和双引号来创建字符串字面值。

```php
$ php strings.php 
PHP Perl

```

该脚本将两个字符串输出到控制台。 `\n`是一个特殊的序列，换行。 此字符的效果就像在键入文本时按`Enter`键一样。

## PHP 数组

数组是处理元素集合的复杂数据类型。 每个元素都可以通过索引访问。 在 PHP 中，数组更为复杂。 数组可以视为数组，列表或字典。 换句话说，数组在其他语言中都是我们所谓的数组，列表，字典。

由于集合在所有计算机语言中都非常重要，因此我们将两章专门介绍集合-数组。 这里我们仅显示一个小例子。

`arrays.php`

```php
<?php

$names = [ "Jane", "Lucy", "Timea", "Beky", "Lenka" ];

print_r($names);

```

使用速记符号创建一个数组，在此使用方括号。 数组的元素用逗号分隔。 元素是字符串。 `print_r()`函数将有关变量的人类可读信息打印到控制台。

```php
$ php arrays.php 
Array
(
    [0] => Jane
    [1] => Lucy
    [2] => Timea
    [3] => Beky
    [4] => Lenka
)

```

这是脚本的输出。 这些数字是指数，我们可以通过它们访问数组元素。

## PHP 对象

到目前为止，我们一直在讨论内置数据类型。 对象是用户定义的数据类型。 程序员可以创建适合其域的数据类型。 在有关面向对象的程序设计（OOP）的一章中，有关对象的更多信息。

## PHP 资源

资源是特殊的数据类型。 他们拥有对外部资源的引用。 它们是由特殊功能创建的。 资源是打开文件，数据库连接或图像画布区域的处理器。

## PHP `NULL`

还有另一种特殊的数据类型-`NULL`。 基本上，数据类型表示不存在，未知或为空。

在 PHP 中，在三种情况下，变量为`NULL`：

*   它没有分配值
*   它被分配了一个特殊的`NULL`常量
*   它是用`unset()`函数取消设置的

`nulltype.php`

```php
<?php

$a;
$b = NULL;

$c = 1;
unset($c);

$d = 2;

if (is_null($a)) echo "\$a is null\n";
if (is_null($b)) echo "\$b is null\n";
if (is_null($c)) echo "\$c is null\n";
if (is_null($d)) echo "\$d is null\n";

```

在我们的示例中，我们有四个变量。 其中三个被认为是`NULL`。 我们使用`is_null()`函数来确定变量是否为`NULL`。

```php
$ php nulltype.php 
$a is null
$b is null
$c is null

```

这是脚本的结果。

## PHP 类型转换

我们经常一次处理多种数据类型。 将一种数据类型转换为另一种数据类型是编程中的常见工作。 类型转换或类型转换是指将一种数据类型的实体更改为另一种。 有两种转换类型：隐式转换和显式转换。 隐式类型转换，也称为强制转换，是编译器自动进行的类型转换。

```php
php> echo "45" + 12;
57
php> echo 12 + 12.4;
24.4

```

在上面的示例中，我们有两个隐式类型转换的示例。 在第一个语句中，字符串将转换为整数并添加到第二个操作数。 如果两个操作数中的任何一个都是浮点数，则两个操作数都将被求值为浮点数，结果将是一个浮点数。

当我们使用诸如`(boolean)`之类的强制转换构造时，会发生显式转换。

```php
php> $a = 12.43;
php> var_dump($a);
float(12.43)
php> $a = (integer) $a;
php> var_dump($a);
int(12)
php> $a = (string) $a;
php> var_dump($a);
string(2) "12"
php> $a = (boolean) $a;
php> var_dump($a);
bool(true)

```

此代码段显示了实际的强制转换。 首先，我们将浮点值分配给变量。 稍后我们将其转换为整数，字符串，最后转换为布尔数据类型。

在 PHP 教程的这一部分中，我们介绍了 PHP 数据类型。