数据类型分类与概述

标量类型:

标量类型也可以理解为“基本类型”,“简单类型”。

标量类型包括如下4种:

字符串类型:String,就是一串字符串,当做一个整体,表示一个连续有确定顺序的字符串。通常需要使用单引号或双引号来引起来,比如:

$name = "张三";

整数类型:Int, Integer

浮点数: Float, Double,就是数学上的小数。

布尔类型: Bool, Boolean,这种数据类型只有两个数据:true, false

$is_graduate = true;
$hasMoney = false;

复合类型:

就是“数组”(Array)和“对象”(Object)两种。

特殊类型:

空类型: 有且只有一个数据可以使用,那就是null

资源类型:后续再说。。。。

整型integer,int

四种书写形式

可以有4种直接书写的形式:

10进制形式:

$n1 = 123;

8进制形式:

$n1 = 0123; //以0开头

16进制形式:

$n1 = 0x12A34; //以0x开头,还可以有A,B,C,D,E,F这个6个“16进制数字”

2进制形式:

$n1 = 0b1011011010; //以0b开头

下表为进制对比:

10 进制8 进制16 进制2进制
0000
1111
22210
33311
444100
555101
666110
777111
81081000
91191001
1012A1010
1113B1011
1214C1100
1315D1101
1416E1110
1517F1111
16201010000

演示:

<?php 
$n1 = 123;
$n2 = 0123;
$n3 = 0x123;
$n4 = 0b1010;
echo "<br>n1=" . $n1; // n1=123
echo "<br>n2=" . $n2; // n2=83
echo "<br>n3=" . $n3; // n3=291
echo "<br>n4=" . $n4; // n4=10
?>

进制的相互转换

直接通过系统函数来进行,能完成:

10进制转为2, 8, 16进制:decbin():将10进制转为2进制、decoct():将10进制转为8进制、dechex():将10进制转为16进制。

或者2, 8, 16进制转为10进制:bindec():将2进制数字字符串转为10进制、octdec():将8进制数字字符串转为10进制、hexdec():将16进制数字字符串转为10进制

演示:

<?php 
$n1 = 100;
//将它转换为2,8,16进制分别如下:
$v1 = decbin($n1);
$v2 = decoct($n1);
$v3 = dechex($n1);
echo "<br>v1 = 0b" . $v1; // v1 = 0b1100100
echo "<br>v2 = 0" . $v2; // v2 = 0144
echo "<br>v3 = 0x" . $v3; // v3 = 0x64
?> 

总结一下进制转换的单词:dec:10进制、oct: 8进制、hex: 16进制、bin: 2进制

<?php 
$n1 = "100";    //当做二进制数字字符串
$n2 = "17";        //当做8进制数字字符串
$n3 = "1b";        //当做16进制数字字符串

echo "<br>二进制100转换为10进制为:"  . bindec($n1); // 二进制100转换为10进制为:4
echo "<br>8进制17转换为10进制为:"  . octdec($n2); // 8进制17转换为10进制为:15
echo "<br>16进制1b转换为10进制为:"  . hexdec($n3); // 16进制1b转换为10进制为:27
?>

进制转换案例:

表单上有个输入框,一个下拉列表(包含6种转换),以及一个按钮“转换”。实现可灵活进行进制转换的功能。

<?php 
$n1 = "";
$n2 = "";
$zh = "";
if(isset($_POST['submit1'])){
    $n1 = $_POST['n1'];
    $zh = $_POST['zhuanhuan'];
    if($n1){    //判断如果有数据!
        if( $zh == "10to2" )
        {
            $n2 = decbin($n1);
        }
        if( $zh == "10to8" )
        {
            $n2 = decoct($n1);
        }
    }
    
}
 ?>
<body>
    <form action="" method="post">
        <input type="text" name="n1" value="<?php echo $n1;?>">
        <select name="zhuanhuan">
            <option value="10to2" <?php if($zh == "10to2"){ echo "selected"; } ?> >10to2</option>
            <!-- <option value="10to8" 如果$zh等于"10to8"就输出selected  >10to8</option> -->
            <option value="10to8" <?php if($zh == "10to8"){ echo "selected"; } ?> >10to8</option>
        </select>
        <input type="submit" name="submit1" value="转换">
        <input type="text" name="n2" value="<?php echo $n2;?>">
    </form>
</body>

思考题:怎么将一个8进制的数, 转换为16进制?

浮点型float

浮点数就是相当于数学上的“小数”

两种书写形式:

直接小数点形式:

$f1 = 0.1; //或者1.23; 123.0;

科学计数法

$f2 = 1.23e3; //表示1.23 乘以10的3次方
$f3 = 123e2; //这个也是浮点数,虽然其结果值是一个“整数”(12300)

特别注意:浮点数不要做相等比较(==):因为浮点数进行相等比较,是“不可靠”的:

$v1 = 0.1 + 0.2;
$v2 = 0.3;

问:$v1和$v2相等吗?那怎么办?

需要在考虑精度的基础上,将浮点数转换为整数,然后进行“比较大小”,此时,在精度范围内,如果相等,我们就认为是相等的。将上述程序改造为:

演示:

<?php 
$v1 = 0.1;
$v2 = 0.2;
$v3 = 0.3;
if( $v3 == $v1 + $v2)
{
    echo "相等1";
}
else
{
    echo "不相等1";
}
echo "<h1>下面来对其做“正确的比较方式”</h1>";
//假设目前需要精确到小数点后4位,
//那么就乘以10000,然后转换为整数去比较
if( round($v3 * 10000) == round( ($v1 + $v2) * 10000 ) ) 
{
    echo "相等2";
}
else
{
    echo "不相等2";
}
 ?>

布尔型Boolean

只有两个数据值: true, false(不区分大小写)

在需要当做“布尔值”进行判断或比较的时候,以下数据会被当作布尔值的 false:false, 0, 0.0, “”, null, ‘0’, 空数组

其余都被当做布尔值的 true。

常见应用代码类似这样:

$v1 = null;

if( $v1 ) { //此时,如果\$v1为上述值之一,就会当做false,不执行其中的代码。

    // 。。。代码。。。

}
//而对于其他值,就会当做true,因此就会执行其中的代码。

字符串型String

可以使用单引号或双引号来表示(引起来)。表示一串“连续的字符”,最短的字符串是“空字符串”,比如: $str1 = “”。注意:这个不是空字符串: “ ”, 因为其中包括了1个空格字符。

$name = "张三";

$edu = "北京大学";

$title = "关于微信应用的几个改进建议"; //文章标题

$v1 = ''; //这也是字符串(空字符串)

$v2 = '123'; //这还是字符串

$v3 = "false"; //这仍然是字符串

特别注意:双引号字符串中,如果出现“$”符号,则该符号后的连续字符(单词)会被识别为一个变量名。

如果识别成功(即确实存在该变量),则会将该变量转换为实际内容。

如果识别失败(即实际没有该变量),则会报错。

演示:

<?php 
$v1 = 10;
echo "<br>v1的值为:" . $v1;
echo "<br>v1的值为:$v1";
echo '<br>v1的值为:$v1';
echo "<br>";
echo "<br>\$v1的值为:$v1";
 ?>

数组类型Array

数组,就是将多个“数据”放在一起,排成一个序列,这个序列作为一个整体(里面包括了多个数据),就称为“数组”。比如:

$arr1 = array('张三丰', 18, '男');

或另一种形式:

$arr2 = array('name' => '张三丰', 'age'=\>18, 'gender' => '男' );

数组的赋值:$数组变量[下标] = 一个值;

数组的取值:行为为:$数组变量[下标]

 echo $arr1[0]; print_r( $arr2['name'] );

其内部结构,可以这样去理解:

\$info内部结构:

键名/下标/索引
0‘张三丰’
118
2‘男’

这种下标,通常称为“数字下标”。

$info2内部结构:

键名/下标/索引
‘name’‘张三丰’
‘age’18
‘gender’‘男’

这种下标,通常被称为“字符串下标”。

空类型NULL

只有一个值: null(不区分大小写)。

$v1 = null; //此时,具有变量$v1,但其中的数据是“空的”(没有数据)

空值变量,isset()判断的结果是false(即不存在)。

类型判断

gettype(): 获取一个变量的类型,结果为一个变量类型的名称(字符串)

$v1 = 10;

$r1 = gettype( \$v1 ); //结果为:“integer”

$v2 = 'abc';

$r2 = gettype( \$v2 ); //结果为:“string”

settype(): 设置一个变量的类型

$v1 = 10; //此时,\$v1中数据是整数类型

settype( $v1, 'string'); //此时,\$v1是字符串类型,即其中的数据变成了:“10”

var_dump(): 输出变量的“完整信息”,包括变量类型,长度(如果需要),内容

判断是否为某种类型(类型系列函数):

  • is_int() / is_integer():判断是否为整数类型
  • is_float():判断是否为浮点类型
  • is_bool():判断是否为布尔类型
  • is_string():。。。
  • is_array():。。。
  • is_numeric():判断是否为“数字”类型(含整数,小数,以及“纯数字字符串”)
  • is_object():

两个特殊判断:

  • isset():判断一个变量中是否有数据,如果有返回true,如果没有(即此时就是null)返回false
  • empty():判断是否为“空的”。如果确实是“空的”,返回true,否则返回false。

“空的”的意思,比较接近日常生活中的“没有”。而空(null)是一个计算机中的特殊概念,表示“完全不存在”,可以理解为“真空”。

类型转换

自动转换

我们无需做任何处理,而是,程序会根据运算时运算符所需要的数据类型进行转换。

如果参与运算的数据不是需要的类型,则会自动转换为需要的数据类型。

$v1 = 1 + “3”; //结果是4;

$v2 = 1 . “3”; //“.”是字符串连接符,这里,1会被转换为字符串,结果是:“13”

典型自动转换:

转换为数字:

1+”2” //

“1” + “2” //

1 + ”2abc” //

1 + ”2abc34” //

1 + “abc” //

1 + “abc2” //

1.2 + “2” //

1.2 + “2.2abc” //

1.2 + “abc2.2” //

“1.2abc” + 2 //

“1.2abc” + “2abc” //

转换为整数:

10.8 % 3.6

“10.8” % “3.6”

“10.8” % “3.6abc”

“10.8ab” % “3.6cd”

强制转换:

人为使用强转换语法进行转换,比如:

$v1 = (int) “1”; //结果,\$v1是整数类型的1
$v2 = (float) “1.23”; //结果,\$v2是浮点类型的1.23
$v3 = (string) \$v1; //结果,\$v3是字符串“1”

==========