zoukankan      html  css  js  c++  java
  • PHP数据类型

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

    • 四种标量类型:
      • boolean (布尔型)
      • integer (整型)
      • float (浮点型,也称作double)
      • string (字符串)
    • 三种复合类型:
      • array (数组)
      • object (对象)
      • callable (可调用)
    • 两种特殊类型:
      • resource (资源)
      • NULL (无类型)

    整型

    整数是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的某个数。整数不包括小数、分数。

    (1) PHP不支持无符号整型(unsigned),即PHP中的整数都是有符号的。

    (2) 整型数据所占的字节数和平台有关,通常是8个字节,可以通过输出PHP_INT_SIZE来检查int型数据所占字节数

    (3) 整型所能表示的最大数(64位系统,8字节)为9223372036854775807,可以通过输出预定义常量PHP_INT_MAX来检测整型所能表示的最大数,如果超出这个范围,那么这个数据就会被解释为float型,如果超出float型则这个数据就会被解释为无穷大(INF)

    (4) 整型可以用三种格式来指定:十进制、十六进制(以0x为前缀)、八进制(以0为前缀)。

    浮点型

    浮点数是带小数部分的数字,或是指数形式。

    (1) 浮点数的字节长度和平台相关,通常最大值是1.8e308,并且具有14位十进制数字的精度,小数的精度从数字的左边第一个不为0的数开始算起。

    (2) 由于浮点数有精度损失,所以当我们对浮点数进行比较的时候(指含有运算的)最好不要在if条件语句中判断一个结果为浮点数的变量是否和另一个浮点数相等,比如下面的表达式

    $a = 0.1; $b = 0.2; $c = 0.3; ======> ($a + $b - $c) != 0;
    

    如果实在需要比较,那么我们可以设置一个极小值,然后判断两个浮点数的差的绝对值(求浮点数的绝对值用abs()函数)是否小于我们设置的这个极小值,如果小于这个极小值我们基本可以认为他们是相等的。

    这些精度损失一般发生在运算的过程中,如果我们直接比较两个不含运算的浮点数,则不会出现上述问题。例如

    $a = 0.1; $b = 0.1;  =====> 则$a和$b是相等的
    

    字符串

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

    注意:string最大可以达到2GB。

    (1) 在PHP中,既支持用单引号包围字符串也支持双引号包围字符串。但是单引号和双引号是有区别的,说明如下:

    单引号:单引号不会解析$,但是执行效率高,速度快。因此建议能用单引号的地方尽量用单引号。单引号会原样输出单引号内的内容,无论有没有变量。

    双引号:双引号会解析$,但执行效率比单引号要稍微低一些。如果一个字符串中有PHP变量需要解析,则应当使用双引号。

    (2) 如果双引号中有比较复杂的变量,则要求使用{}括起来,否则无法解析。

    $tag = "你好!";
    $arr = ['name' => 'itbsl', 'age' => 18];
    
    //PHP能解析$tag变量,但是却无法直接解析$arr['name']和$arr['age'],在运行时会报错。
    $str = "$tag, $arr['name']的年龄是$arr['age']"; //错误用法
    
    //对于复杂变量,比如数组,加上大括号告诉PHP,括起来的要当成变量处理。
    $str = "$tag, {$arr['name']}的年龄是{$arr['age']}"; //正确用法
    
    echo $str;
    

    (3) heredoc使用

    示例:

    $arr = ['name' => 'itbsl', 'age' => 18];
    
    $str = <<<HTMLSTR
        <h1>hello,world</h1>
        <h1>hello,world</h1>
        <h1>hello,world</h1>
        <h1>{$arr['name']}</h1>
    HTMLSTR;
    
    1. 相当于双引号,也被称为双引号标识符,标识符中的$会被解析,特别适合大量的html代码
    2. `<<<`代表界定符号
    3. HTMLSTR指标识符,一般是大写,不过标识符名字可以自己随意指定。
    4. 上面的标识符后面一定不要有任何的字符,包括空格
    5. 下面的标识符要与上面的标识符名字保持一致,必须的
    6. 下面的标识符前面不要有任何字符包括空格,要顶格写
    7. 标识符中间的代码可以随机写,没有上面那些严格的限制
    8. 以上只对PHP7.2以前有效(PHP<=7.2),PHP7.3对heredoc和nowdoc进行了改进,在使用上更加方便了,没有那么多的限制,想了解详情可以到PHP官网查看
    

    (4) nowdoc使用

    nowdoc与heredoc的用法基本一致,只有两点不一样,一个是nowdoc的上面的标签需要单引号引起来,而heredoc不需要。第二点区别是nowdoc不会解析标识符内的$,也就是说不会解析标识符内的内容,即使里面有变量也不会解析,类似于单引号的用法,所以nowdoc也称作单引号标识符

    (5) 在字符串中调用函数

    如果在双引号包裹的字符串中有{$变量名()}的形式,PHP引擎就会查找有没有和这个变量的值同名的函数,如果有的话就会调用和这个变量的值同名的函数。

    示例:

    function test() {
        return 'itbsl';
    }
    
    $name = 'test';
    
    echo "Hello, {$name()}";
    

    运行代码,会输出Hello, itbsl

    (6) 计算字符串的长度的函数是strlen()不能用count(),count()函数是用来计算数组的长度的,如果我们用count()计算一个字符串的长度,无论这个字符串多长,用count统计的结果都将是1.即使是一个空字符串用count()函数统计的结果都是1.

    其它类型数据也可以使用字符串处理函数,不过是先将其它类型自动转换为字符串再处理。比如用strlen(10000),函数会先将10000转换为字符串“10000”,然后在处理,所以它的长度是5.

    (7) 字符串可以像数组一样,通过下标来访问每个字符。但是字符串不是数组,例如一个字符串$str =
    'hello';如果我们想输出字符串的前两个值,我们可以echo $str[0].$str[1];或者echo
    $str{0}.$str{1};(建议字符串用大括号访问,这样可以和数组区分。)

    布尔型

    布尔型可以是 TRUE 或 FALSE。

    要指定一个布尔值,使用常量 TRUEFALSE。两个都不区分大小写。

    布尔型通常用于条件判断。

    以下值在PHP中都会被当做false对待:

    • 布尔值false自身
    • 整型值 0
    • 浮点型值 0.0
    • 空字符串,以及字符串“0”(需要注意字符串值为“0”的情况)
    • 不包含任何元素的数组
    • 特殊类型null(包括尚未赋值的变量)
    • 从空标记生成的SimpleXML对象

    数组

    PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。

    定义数组语法:

    //方式一:
    array(key => value, key2 => value2, ...);
    
    //方式二:短数组定义语法
    [key => value, key2=>value2, ...]
    
    说明:
    //键(key)可以是一个整数integer或字符串string
    //值(value)可以是任意类型的值
    

    示例:

    //方式一
    $arr = array('name' => 'itbsl', 'age' => 18);
    
    //方式二
    $arr = ['name' => 'itbsl', 'age' => 18];
    

    最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。

    注意:

    (1)“+”:两个数组相加,如果两个数组有相同的键,则后面相同的键不会被加进去

    (2)“==”:可以判断两个数组是否含有相同的键值对

    (3)“===”:可以判断,两个数组是否含有相同的键值对,而且顺序一样,而且数据类型也要一样。

    资源类型

    资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

    NULL

    特殊的 NULL 值表示一个变量没有值。NULL类型唯一可能的值就是 NULL,不区分大小写。

    下列情况的变量值被认为是NULL:

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

    对象

    其广义指的是在内存上一段有意义的区域,称作为一个对象。

    callable

    自 PHP 5.4 起可用 callable类型指定回调类型 callback。

    一些函数如 call_user_func()usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

    基本数据类型的转换

    自动转换

    自动转换是由低到高的,boolean -> int -> float

    注意:当一个整型或者浮点型数据与字符串型数据进行运算时会比较特别,举例如下

    定义三个变量,分别为整型、浮点型、字符串型:$a = 4; $b = 4.5; $c = '12fff';

    当计算$d = $a + $c;时,输出$d的结果为16,输出数据类型为整型,如果将$c的值改为'eee123fff',那么输出$d的结果为4,这里可以说明,如果一个字符串和一个整型或浮点型数据进行运算,那么如果这个字符串的开头是数值型字符串,那么PHP解析器会把开头部分的数值截取出来(如果$c='12.5fff',那么会截取出12.5而不是12)和整型或者浮点型数据进行运算,结果为浮点型那么$d的类型就是浮点型,如果结果为整型那么$d的数据类型就是整形。如果这个字符串的开头不是数值型字符而是类似于eee123abc这样的字符串,虽然其中包含了数值型的字符,他也仍然是无法直接参与计算的,这种字符串会被转换成0。那么此时的$d = $a + $c,就相当于$d = $a + 0;

    总结:

    如果是字符串和数字进行基本运算,那么会先把字符串转换成数字,如果无法转换成数字,那么就把字符串当做0

    如果是字符串和字符串进行基本运算,那么会尝试把两个字符串都转换成数字,如果有一个能转换成数字,那么结果就是这个数字,如果两个都不能转成数字,那么两个当做0,因此结果也就为0了。

    强制转换

    强制转换的方法有三种

    • setType(变量名,'类型')

      类型可以是int integer float bool boolean string array object,类型需要用单引号引起来,这一种是直接对变量本身修改

    • (类型)变量

      类型可以是int integer float bool boolean string array object,不对变量本身修改,而是返回新的值

    • intval(变量) floatval(变量) strval(变量) boolval(变量), 不对变量本身或者值修改,而是返回新的值

    如何知道一个变量是什么数据类型?

    答: 用函数gettype(变量名)即可获取该变量的类型。

  • 相关阅读:
    hive数据倾斜处理
    hbase基本命令
    hdfs基本操作命令
    hive常用函数
    sql面试题
    tcpdump 的正确食用方法
    kotlin 学习感受
    搭建docker hadoop环境
    安全模型分析核心
    personal evolution
  • 原文地址:https://www.cnblogs.com/itbsl/p/9902254.html
Copyright © 2011-2022 走看看