php数据类型
首页->学习资料->编程语言->php教程->php基础 关键词: 发布时间:2016-01-12 13:01:42 浏览次数:2284

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

四种标量类型:


  • boolean(布尔型)    

  • integer(整型)    

  • float(浮点型,也称作 double)    

  • string(字符串)    


两种复合类型:


  • array(数组)    

  • object(对象)    


最后是两种特殊类型:


  • resource(资源)    

  • NULL(无类型)    


为了确保代码的易读性,本手册还介绍了一些伪类型:


  • mixed(混合类型)    

  • number(数字类型)    

  • callback(回调类型)  


  • 1、 boolean型

  • 当转换为 boolean 时,以下值被认为是 FALSE:


  • 布尔值 FALSE 本身    


  • 整型值 0(零)    


  • 浮点型值 0.0(零)    


  •     空字符串,以及字符串 "0"    


  • 不包括任何元素的数组    


  •     不包括任何成员变量的对象(仅 PHP 4.0 适用)    


  •     特殊类型 NULL(包括尚未赋值的变量)    


  •     从空标记生成的 SimpleXML 对象    

  • 所有其它值都被认为是 TRUE(包括任何资源)。

  • Warning    

  • -1 和其它非零值(不论正负)一样,被认为是 TRUE!

  • <?php
    var_dump((bool) "");        // bool(false)
    var_dump((bool) 1);         // bool(true)
    var_dump((bool) -2);        // bool(true)
    var_dump((bool) "foo");     // bool(true)
    var_dump((bool) 2.3e5);     // bool(true)
    var_dump((bool) array(12)); // bool(true)
    var_dump((bool) array());   // bool(false)
    var_dump((bool) "false");   // bool(true)
    ?>



2、整型

Integer 整型

一个 integer 是集合 ? = {..., -2, -1, 0, 1, 2, ...} 中的一个数。

语法

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

Example #1 整数文字表达

<?php
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
?>

Warning    

如果向八进制数传递了一个非法数字(即 8 或 9),则后面其余数字会被忽略。

Example #2 八进制数的怪事

<?php
var_dump(01090); // 八进制 010 = 十进制 8,忽略了后面的90
?>


整数溢出

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

Example #3 32 位系统下的整数溢出

<?php
$large_number = 2147483647;
var_dump($large_number);                     // int(2147483647)

$large_number = 2147483648;
var_dump($large_number);                     // float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);                     // float(50000000000)
?>

Example #4 64 位系统下的整数溢出

<?php
$large_number = 9223372036854775807;
var_dump($large_number);                     // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number);                     // float(9.2233720368548E+18)

$million = 1000000;
$large_number =  50000000000000 * $million;
var_dump($large_number);                     // float(5.0E+19)
?>

PHP 中没有整除的运算符。1/2 产生出 float    0.5。值可以舍弃小数部分强制转换为 integer,或者使用     round() 函数可以更好地进行四舍五入。

<?php
var_dump(25/7);         // float(3.5714285714286) 
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7));  // float(4) 
?>


从布尔值转换

FALSE 将产生出 0(零),TRUE 将产生出     1(壹)。

从浮点型转换

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围(32 位平台下通常为     +/- 2.15e+9 = 2^31,64 位平台下通常为 +/- 9.22e+18 = 2^63),则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!

Warning    

决不要将未知的分数强制转换为 integer,这样有时会导致不可预料的结果。

<?php
echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
?>


3、Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

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


Warning  

浮点数的精度

浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754    双精度格式,则由于取整而导致的最大相对误差为    1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。

此外,以十进制能够精确表示的有理数如 0.1 或    0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10)    通常会返回 7 而不是预期中的    8,因为该结果内部的表示其实是类似    7.9999999999999991118...。

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。


转换为浮点数

如果希望了解有关何时和如何将字符串转换成浮点数的信息,请参阅"字符串转换为数值"一节。对于其它类型的值,其情况类似于先将值转换成整型,然后再转换成浮点。请参阅"转换为整型"一节以获取更多信息。自    PHP 5 起,如果试图将对象转换为浮点数,会发出一条 E_NOTICE 错误消息。

比较浮点数

如上述警告信息所言,由于内部表达方式的原因,比较两个浮点数是否相等是有问题的。不过还是有迂回的方法来比较浮点数值的。

要测试浮点数是否相等,要使用一个仅比该数值大一丁点的最小误差值。该值也被称为机器极小值(epsilon)或最小单元取整数,是计算中所能接受的最小的差别值。

$a和$b在小数点后五位精度内都是相等的。

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

NaN

某些数学运算会产生一个由常量 NAN    所代表的结果。此结果代表着一个在浮点数运算中未定义或不可表述的值。任何拿此值与其它任何值进行的松散或严格比较的结果都是    FALSE。

由于 NAN 代表着任何不同值,不应拿    NAN 去和其它值进行比较,包括其自身,应该用     is_nan() 来检查。


4、字符串


String 字符串

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着   PHP 只能支持 256 的字符集,因此不支持 Unicode 。详见字符串类型详解。

Note:    string 最大可以达到 2GB。

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ')。

双引号

如果字符串是包围在双引号(")中, PHP 将对一些特殊的字符进行解析:

转义字符


序列

含义


n    换行(ASCII 字符集中的 LF 或 0x0A (10))    

r    回车(ASCII 字符集中的 CR 或 0x0D (13))    

t    水平制表符(ASCII 字符集中的 HT 或 0x09 (9))    

v    垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)    

e    Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)    

f    换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)    

   反斜线    

$    美元标记    

"    双引号    

[0-7]{1,3}    符合该正则表达式序列的是一个以八进制方式来表达的字符    

x[0-9A-Fa-f]{1,2}    符合该正则表达式序列的是一个以十六进制方式来表达的字符    


Example #9 一些字符串示例

<?php
// 取得字符串的第一个字符
$str = 'This is a test.';
$first = $str[0];

// 取得字符串的第三个字符
$third = $str[2];

// 取得字符串的最后一个字符
$str = 'This is still a test.';
$last = $str[strlen($str)-1]; 

// 修改字符串的最后一个字符
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>

转换成字符串

一个值可以通过在其前面加上 (string) 或用  strval()    函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为    string。比如在使用函数  echo 或  print    时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数     settype()。

一个布尔值 boolean 的 TRUE 被转换成 string 的    "1"。Boolean 的 FALSE 被转换成    ""(空字符串)。这种转换可以在 boolean    和 string 之间相互进行。

一个整数 integer 或浮点数 float 被转换为数字的字面样式的    string(包括 float    中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。

<?php
$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1)
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
?>


5、数组  array()

可以用  array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的     键(key) => 值(value)对。

array(  key =>  value
    , ...
    )
// 键(key)可是是一个整数 integer 或字符串 string

// 值(value)可以是任意类型的值

此外 key 会有如下的强制转换:

  •       包含有合法整型值的字符串会被转换为整型。例如键名    "8" 实际会被储存为        8。但是 "08"    则不会强制转换,因为其不是一个合法的十进制数值。      

  •       浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名    8.7 实际会被储存为 8。      

  •       布尔值也会被转换成整型。即键名        true 实际会被储存为 1    而键名 false 会被储存为 0。      

  • Null 会被转换为空字符串,即键名        null 实际会被储存为 ""。      

  •       数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。      

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

Example #2 类型强制与覆盖示例

<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
?>

以上例程会输出:

array(1) {
 [1]=>
 string(1) "d"
}


Example #5 仅对部分单元指定键名

<?php
$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
var_dump($array);
?>

以上例程会输出:

array(4) {
 [0]=>
 string(1) "a"
 [1]=>
 string(1) "b"
 [6]=>
 string(1) "c"
 [7]=>
 string(1) "d"
}


Note:

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上      1(但是最小为 0)。如果当前还没有整数索引,则键名将为      0。

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);

// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);

// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

以上例程会输出:

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
)
Array
(
)
Array
(
   [5] => 6
)
Array
(
   [0] => 6
   [1] => 7
)


赞:(0)
踩:(0)
相关文章
php常用魔术常量与魔术方法
php中session_destroy与session_un
php中数组合并的几种方法
php变量
php比较运算符
echo,print,printf,print_r,sprint
php变量的作用域
apache虚拟目录配置
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:941420
粤ICP备18028092号-1  微信:hurong241