2.PHP数据类型

PHP 数据类型简介

PHP 支持 8 种原始数据类型。

四种标量类型:

  • boolean(布尔型)
  • integer(整型)
  • float(浮点型,也称作 double)
  • string(字符串)

两种复合类型:

  • array(数组)
  • object(对象)

最后是两种特殊类型:

  • resource(资源)
  • NULL(无类型)

类型检测

var_dump() 函数可以查看表达式的值和类型
gettype() 函数用于检测变量类型
is_ 加类型,如 is_int(),is_array() 等,判断变量是否为该类型

创建 test.php,并编辑内容

<?php
$a = TRUE;
$b = 'foo';
$c = 0.1;
$d = 12;

if(is_string($b)) {
    echo nl2br("$b 是字符串".PHP_EOL);
}
if(is_int($c)) {
    echo nl2br("$c 是整型".PHP_EOL);
}
var_dump($a);
echo '<br/>';
var_dump($b);
echo '<br/>';
echo gettype($c).PHP_EOL;
echo '<br/>';
echo gettype($d);

结果输出

foo 是字符串
bool(true) 
string(3) "foo" 
double integer

Boolean 布尔类型

布尔类型表达了真值,可以为 TRUE 或 FALSE,不区分大小写。

<?php

$a = True;
$b = False;

var_dump($a);// bool(true)
var_dump($b);// bool(false)

运算返回 boolean 类型的结果:

// == 是一个操作符,它检测两个变量值是否相等,并返回一个布尔值

注意当下列情况转换为 Boolean 时,其值为 FALSE

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 "0"
  • 不包括任何元素的数组(但是空数组和空字符串或整型零不等)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

Integer 整型

整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。

注意:要使用八进制表达,数字前必须加上 0。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b。

<?php

$a = 1234; // 十进制数
$b = -123; // 负数
$c = 0123; // 八进制数 (等于十进制 83)
$d = 0x1A; // 十六进制数 (等于十进制 26)
整数溢出

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

<?php

$a = 123445566;
$b = 9223372036854775807;
$c = 9223372036854775808;
$d = 50000000000000 * 1000000;

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

Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;

浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)

String 字符串类型

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节,PHP 中有 4 中表达方式

  • 单引号
    单引号内特殊字符和变量不会被解析
<?php
$a = 'Hello';
echo '$a \n World';//$a \n World
  • 双引号
    双引号内的特殊字符和变量会被解析。
<?php
$a = 'Hello';
/**
 * Hello
 *   World
 */
echo "$a \n World";
  • Heredoc
    Heredoc 类似与双引号,内部转义字符和变量可以被解析,句法结构为
<<<EOT

字符串

EOT;

其中 EOT 为标识符,可以自定义,但是首尾标识符必须相同。开始标识符 EOT 后需换行,结束标识符 EOT 必须独占一行,且前面不许有空格。

<?php
$a ='Hello' ;
echo <<<EOT
$a Hello
EOT;
  • Nowdoc
    Nowdoc 类似于单引号,无法解析转义字符和变量。句法结构类似 Heredoc,但是需要在开始标识符加上单引号。
<?php
$a ='Hello' ;
echo <<<'EOT'//和 Heredoc 不同点
$a Hello
EOD;

Array 数组

数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

语法

定义数组可以用 array()[] 来新建一个数组。它接受任意数量用逗号分隔的键(key) => 值(value)对。key 可以是 integer(索引数组)或者 string(关联数组),value 可以是任意类型,如对象、数组。

<?php

$a = [
    "b" => "bb",
    "c" => "cc",
];

$b = [
    "bb",
    "cc"
];
$c = [
    "bb",
    "cc",
    "a" => $a,
    "b" => $b,
];

var_dump($a);
var_dump($a[0]);
var_dump($b);
var_dump($b['b']);
var_dump($c['a']['b']);

从结果中可以看到

  • 如果没有键名,则数组默认使用从 0 开始的数字键名
  • 打印数组不存在的 key 的值时,直接返回 NULL
  • 数组可以多维嵌套,通过键名可以获取特定值

Object 对象

使用 new 可以创建一个新的对象

<?php

class foo
{
    function do()
    {
        echo "Action do"; 
    }
}

$f = new foo;
$f->do();
转换为对象

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值,除了数字键,不迭代就无法被访问。

<?php

class A
{
}

$a = new A();
$b = (object)$a;
$c = (object)'A';
$d = (object)NULL;
$e = (object)['hello'=>'world'];

var_dump($a);
var_dump($b);
var_dump($c->scalar);
var_dump($d);
var_dump($e->hello);

从结果中可以看出

  • $a 是对象,转换为对象后不发生变化,所以 $a 等于 $b
  • 字符串 "A" 转换为对象时,自动生成 scalar 属性
  • 数组 ['hello'=>'world'] 转换为对象时,键名 hello 作为属性,键值 world 为属性值

Resource 资源

资源 resource 是一种特殊变量,保存了外部资源的一个引用,如打开文件、数据库连接等,资源是通过专门的函数来建立和使用的

<?php

$file = fopen($filename);//打开文件
$db = mysqli_connect();//数据库连接
转换为资源

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

释放资源

引用计数系统是 Zend 引擎的一部分,可以自动检测到一个资源不再被引用了(和 Java 一样)。这种情况下此资源使用的所有外部资源都会被垃圾回收系统释放。因此,很少需要手工释放内存。

NULL

特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。 在下列情况下一个变量被认为是 NULL:

  • 被赋值为 NULL
  • 尚未被赋值
  • 被 unset()
语法

NULL 类型只有一个值,就是不区分大小写的常量 NULL。

<?php

$a = NULL;
转换到 NULL

使用 (unset) 将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回 NULL 值而已

类型转换

PHP 是弱语言类型,定义变量的时候不需要制定变量类型,根据上下文自动解析成对于的变量类型。

<?php

$foo = "0";
var_dump($foo);

$foo += 2;
var_dump($foo);

$foo = $foo + 1.3;
var_dump($foo);

$foo = 5 + "10 Little Piggies";
var_dump($foo);

$foo = 5 + "10 Small Pigs";
var_dump($foo);

从结果中可以看出,PHP隐式转换的优先级为:浮点型 > 整型 > 字符串

类型强制转换

在要转换的变量之前加上用括号括起来的目标类型,如

<?php

$foo = 10;   // $foo 是整数
$bar = (boolean) $foo;   // 转换成布尔类型

允许的强制转换有:

-  (int), (integer) - 转换为整形 integer
-  (bool), (boolean) - 转换为布尔类型 boolean
-  (float), (double), (real) - 转换为浮点型 float
-  (string) - 转换为字符串 string
-  (array) - 转换为数组 array
-  (object) - 转换为对象 object
-  (unset) - 转换为 NULL (PHP 5)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容