深入探讨PHP数据类型

梦想与她 提交于 2020-03-29 02:46:15

PHP是一种弱类型语言:PHP的变量没有数据类型的概念,可以存放任意的数据类型。数据本身都是有数据类型的,数据是人为分类的,分成不同的类型。在PHP中所讲的数据类型指的是变量所保存的数据本身。通常都是用变量的数据类型来代替变量所保存的数据的数据类型。

PHP将数据类型分为三大类八小类:

  • 标量数据类型

整型(integer)

浮点型(float)

布尔型(boolean)

字符串型(string)

  • 复合数据类型

数组(array)

对象(object)

  • 特殊数据类型

空类型(NULL)

资源类型(resoure)

标量数据类型

标量又称之为基本数据类型(简单数据类型)
分为四种:整型,浮点型,布尔型和字符串型

整型

php变量保存的数据是整数(有效范围内)

$a = 3; // 3是一个整型,$a是一个整型
$b = -3; // 整型包含正和负(有符号)

php还能保存其他进制的整型

$num = 123; // 默认是十进制数据
$num = 0123; // 0不代表前缀:告诉服务器当前数据是八进制
$num = 0x123; // 十六进制

php输出给用户默认会全部解析成十进制

// 定义整型变量
$num1 = 123;

// 定义整型最大值
$num2 = PHP_INT_MAX;

// 定义八进制
$num3 = 0123;

// 定义十六进制
$num4 = 0x123;

var_dump($num1,$num2,$num3,$num4);

/*输出结果
int(123)
int(2147483647)
int(83)
int(291)*/

通用的转十进制的方法:将位数上的值 * 对应的进制的 N-1 次方(从右往左)

八进制转十进制

0123 ======> 十进制
3 * 8 ^ (1 - 1) + 2 * 8 ^ (2 - 1) + 1 * 8 ^ (3 - 1)
3 * 1 + 2 * 8 + 1 * 64 = 3 + 16 + 64 = 83

十六进制转十进制

0x123 ======> 十进制
3 * 16 ^ (1 - 1) + 2 * 16 ^ (2 - 1) + 1 * 16 ^ (3 - 1)
3 * 1 + 2 * 16 + 1 * 256 = 3 + 32 + 256 = 291

php可以按照数据本身的进制进行输出:需要使用特定的输出方式printf()

printf('输出方式占位符',要输出的数据列表);

十进制输出:%d
八进制输出:%o
十六进制输出:%x

printf("十进制的123是:%d;八进制的0123是:%o;十六进制的0x123是:%x",123,0123,0x123);
// 输出结果:十进制的123是:123;八进制的0123是:123;十六进制的0x123是:123

浮点型

带小数点的数值都是浮点型,超出整型范围的数值类型也是浮点型。

浮点型数据又称之为精度型数据:分为单精度(float)和双精度(double)

  • float:使用4个字节保存数据:表示的数据范围10^38,但是表示的有效数字(精度)大概为7位。
  • double:使用8个字节保存数据:表示的数据范围10^308,表示的精度范围大概为15位。

php中只有双精度,没有单精度:双精度也是有float表示不是double。

// 定义浮点数:小数点
$f1 = 0.12;
$f2 = -123.0;

// 超出整型范围
$f3 = PHP_INT_MAX + 1;

// 支持科学计算法
$f4 = 1.23e10; // 1.23 * 10 ^ 10
$f5 = 23.4e-10; // 23.4 * 10 ^ -10

// 浮点数如果超出精度范围后,会自动的四舍五入
$f6 = 123456789012345678901234567890;

var_dump($f1,$f2,$f3,$f4,$f5,$f6);

/*输出结果
float(0.12)
float(-123)
float(2147483648)
float(12300000000)
float(2.34E-9)
float(1.2345678901235E+29)*/

为什么浮点数能够存储较大的数据呢?4字节(单精度)
4个字节一共32位:如果全部用来存储数据最多表示42亿多
浮点数:使用一部分用来存储数据,另外一部分存储指数

整型(4个字节)
11111111 11111111 11111111 11111111 表示最大:42亿多

浮点型(4个字节)
11111111 11111111 11111111 11111111 表示最大

其中最左边的1代表符号位
第2-6位的1代表指数(5数):31
后面的1代表数值本身(26位):8个有效数组

组合:符号位(+/-) 数值 * e^指数值
      - 6.7 * 10 ^ 7 * e ^ 31 => - 6.7 * 10 ^ 38

布尔类型

布尔类型只有两种数据:true或者false,布尔类型通常用于判断

// 定义布尔数据
$b1 = true;
$b2 = false;

var_dump($b1,$b2);

/*输出结果
bool(true)
bool(false)*/

在PHP中大部分的数据转换成布尔类型的时候都是true,只有以下几种类型会转换成false

  • 空字符串:' ' 或 ''
  • 0值:0 或 '0' 或 0.0
  • 空数组:array()
  • NULL:null

字符串类型

存储的数据是字符串数据:是一类应用最广的数据类型(互联网之间传递的数据和文件内部存储的数据全部都是字符串)

在php中,字符串有三种定义方式:

单引号:数据用单引号包裹

// 使用单引号定义字符串
$str1 = ''; // 空字符串
$str2 = '123'; // 纯数值型字符
$str3 = 'hello world';

var_dump($str1,$str2,$str3);

/*输出结果
string(0) ""
string(3) "123"
string(11) "hello world"*/

双引号:数据用双引号包裹

// 使用双引号定义字符串
$str4 = "";
$str5 = "456";
$str6 = "你好中国"; // 当前使用的编码是unicode,一个中文是一个字符,占用3个字节存储

var_dump($str4,$str5,$str6);

/*输出结果
string(0) ""
string(3) "456"
string(12) "你好中国"*/

单引号与双引号的区别

  • 单引号与双引号解析的转义字符不一样

    单引号能转移的字符: \\, \'
    双引号能转义的字符: \\, \", \r\n, \t, \$

    $str7 = 'ab\\\r\n\t\$\'\"cdefg';
    $str8 = "ab\\\r\n\t\$\'\"cdefg";
    
    var_dump($str7,$str8);
    
    /*输出结果
    string(19) "ab\\r\n\t\$'\"cdefg"
    string(15) "ab\
        $\'"cdefg"*/
  • 双引号字符串内部的$符号会被解析成变量符号:如果有$符号会被自动当做变量进行输出
    $str = '123';
    
    $str7 = '$str';
    $str8 = "$str";
    
    var_dump($str7,$str8);
    
    /*输出结果
    string(4) "$str"
    string(3) "123"*/

双引号解析变量的时候注意事项:系统没有办法自动的区分变量名字,只要$符号后面跟的普通字符串(字母,下划线和数字)都会被系统当做变量的名字:

  • 解决方案1: 使用非字母,数字或者下划线的符号(空格)
    $str = '123';
    
    $str8 = "$str a";
    
    var_dump($str8);
    
    /*输出结果
    string(5) "123 a"*/
  • 解决方案2: 使用{}将变量包裹起来: 告诉系统内部是一个变量
    $str = '123';
    
    $str8 = "{$str}a";
    
    var_dump($str8);
    
    /*输出结果
    string(5) "123a"*/

定界符:使用定界符包裹数据

$变量 = <<<定界符标志
// 中间所有的内容都是字符串
定界符标志;

$str9 = <<<END
    // 中间所有的内容都是字符串
    <script>
        alert('hello world');
    </script>
END;

echo $str9;

/*输出结果
    // 中间所有的内容都是字符串
    <script>
        alert('hello world');
    </script>*/

定界符特点:

  • 定界符的首标志后面不能跟任何内容:包括空格和注释
  • 定界符内部的内容全部都是属于字符串内容(包括注释)
  • 定界符的结束标志必须顶格:前面不能有任何内容(空格和tap)
  • 定界符的结束符号后面也不能有任何内容

定界符的存在其实本质是为了解决引号字符串的多行问题以及结构问题

定界符分为两种:分别代表单引号和双引号

  • heredoc结构:代表双引号
    $str = 'hello world';
    
    $str9 = <<<END
        // 中间所有的内容都是字符串
        <script>
            alert('$str');
        </script>
    END;
    
    echo $str9;
    
    /*输出结果
        // 中间所有的内容都是字符串
        <script>
            alert('hello world');
        </script>*/
  • nowdoc结构:代表单引号(内部不能解析变量):给定界符首符号加上一对单引号
    $str = 'hello world';
    
    $str9 = <<<'END'
        // 中间所有的内容都是字符串
        <script>
            alert('$str');
        </script>
    END;
    
    echo $str9;
    
    /*输出结果
        // 中间所有的内容都是字符串
        <script>
            alert('$str');
        </script>*/

复合数据类型

只有两种数据类型:

  • 数组
  • 对象

表示能够存储多个数据(保存在内存中的堆区)

特殊数据类型

只有两种数据类型:

  • 空类型:NULL:变量没有指向内存地址
  • 资源类型:resource,外部数据类型
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!