Code前端首页关于Code前端联系我们

PHP 中的类型转换演练示例(自动转换、强制转换)

terry 2年前 (2023-09-25) 阅读数 47 #后端开发

类型转换是指将变量从一种数据类型转换为另一种数据类型。类型转换有两种,一种是自动转换,一种是强制转换。

区分自动类型转换

PHP 不需要(或支持)在变量定义中显式类型定义;变量的类型由使用该变量的上下文确定。这意味着如果将字符串值分配给 var 变量,则 var 就会变成字符串。如果将一个整数赋给$var,它就变成一个整数。

<?php
    $var=123;
    var_dump($var);
    $var='hi';
    var_dump($var);
    $var=true;
    var_dump($var);
?> 

输出如下:
PHP 中类型转换(自动转换,强制转换)实例演练

PHP 自动类型转换的一个示例是“+”加法运算符。如果任何操作数是浮点数,则所有操作数都被视为浮点数,并且结果也是浮点数。否则,操作数被解释为整数,结果也是整数。请注意,这不会改变操作数本身的类型;仅计算操作数的方法和表达式本身的类型发生变化。

<?php
    //运算自动转换
    $foo = "0";  // $foo 是字符串 (ASCII 48)
    var_dump($foo);
    $foo += 2;   // $foo 现在是一个整数 (2)
    var_dump($foo);
    $foo = $foo + 1.3;  // $foo 现在是一个浮点数 (3.3)
    var_dump($foo);
    $foo=1;
    $bar=$foo+1.22;     //$foo还是一个整形,$bar是浮点数
    var_dump($foo);
    var_dump($bar);
?>

目前的结果如下:
PHP 中类型转换(自动转换,强制转换)实例演练

强制转换

PHP中的类型强制转换与C中的非常相似:在要转换的变量之前添加括号中的目标类型。
允许的转换有:

  • (int), (integer) - 转换为整数
  • (bool), (boolean) - 转换为布尔类型 boolean
  • (float), (double) , ( real ) - 转换为浮点类型 float
  • (string) - 转换为字符串 string
  • (array) - 转换为矩阵数组
  • (object) - 转换为对象 object
  • (unset) - 转换 v NULL (PHP 5)

此外,还可以使用strval()、intval()、floatval()等函数进行强制类型转换。

不同类型之间的转换

转换为布尔值

转换为布尔值时以下值被视为 FALSE:

  • 布尔值本身 FALSE
  • 整数值 0(零) 浮动点值 0.0(空)
  • 空字符串和字符串“0”
  • 不包含任何元素的数组
  • 不包含任何成员变量的对象(仅适用于 PHP 4.0)
  • 创建的 SimpleXML 对象来自空标签

所有其他值为 TRUE(包括所有资源)。
测试程序如下:

<?php
    $arr=array();
    if(0){
        echo '0 is true </br>';
    }else{
        echo '0 is false </br>';
    }
    if(0.0){
        echo '0.0 is true </br>';
    }else{
        echo '0.0 is false </br>';
    }
    if(''){
        echo '空字符串 is true </br>';
    }else{
        echo '空字符串 is false </br>';
    }
    if($arr){
        echo "空数组 is true </br>";
    }else{
        echo "空数组 is false </br>";
    }
    if(null){
        echo 'null is true </br>';
    }else{
        echo 'null is false </br>';
    }

当前结果如下:

PHP 中类型转换(自动转换,强制转换)实例演练

转换为字符串类型

可以将值转换为字符串,可以在值前面添加(string)或者使用strval () 功能。在需要字符串的表达式中,它会自动转换为字符串。例如,当使用 echo 或 print 函数时,或者当将变量与字符串进行比较时,就会发生这种转换。下面可以更好地解释类型和类型转换,也可以参考 settype() 函数。

布尔值 TRUE 转换为字符串值“1”。逻辑值 FALSE 将转换为“”(空字符串)。这种转换可以在布尔值和字符串之间完成。

整数或浮点数转换为数字文字样式字符串(包括浮点数的指数部分)。使用指数表示法(4.1E+6)的浮点数也可以进行转换。

注意:数组转为字符串后,就变成了数组。对象无法转换为字符串。资源的来源将始终转换为结构为“资源 ID #1”的字符串,其中 1 是 PHP 在运行时分配给资源的唯一值。不要依赖这个结构,它可能会改变。直接将数组、对象或资源转换为字符串将不会产生除类型之外的任何有用信息。可以使用 print_r() 和 var_dump() 函数列出这些内容类型。

<?php
    error_reporting(E_ALL&~E_NOTICE);
    $arr=array();
    $object=new stdClass();  
    var_dump(strval(1));
    var_dump(strval(1.01));
    var_dump(strval(true));
    var_dump(strval(false));
    var_dump($arr);
?>

当前结果如下:

PHP 中类型转换(自动转换,强制转换)实例演练

转换为浮点数

如果对字符串进行数值运算,包含'.'、'e'或'E'及其数值value 为整数类型 在范围内(由 PHP_INT_MAX 定义),字符串将被视为 float,否则将转换为整数。

<?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)     
?>   

转换为整数

要将值显式转换为整数,请使用 (int) 或 (integer) 强制转换。然而,在大多数情况下,转换是不必要的,因为当运算符、函数或流控制需要整数参数时,该值会自动转换。您还可以使用 intval() 函数将值转换为整数类型。当从 布尔值 转换

时,FALSE 将产生 0(零),TRUE 将产生 1(一)。

float 转换为整数时,会向下舍入。

注意:如果浮点数超出整数范围(在 32 位平台上通常为 +/- 2.15e+9 = 2^31,在 64 位平台上通常为 +/- 9.22e+18 = 2^63)平台),结果未定义,因为没有足够的精度来给出精确的整数结果。在这种情况下,没有任何警告,甚至没有通知! 字符串转换为

时,如果字符串的第一个字母是整数,则转换为整数类型。如果字符串的第一个字母不是整数,则会将其转换为 0。

<?php
    $foo=12 + "5fa";        //结果为17
    var_dump($foo);
    $bar=12 + "f5a";        //结果为12
    var_dump($bar);
    ?>

转换为数组

对于任何整数、浮点数、字符串、布尔值和资源类型,将值转换为数组将得到仅包含一个索引为 0 的元素的数组,该元素是该标量的值。换句话说,(矩阵)calarV 值与(标量)矩阵完全相同。

如果将一个对象输入到数组中,则结果是一个数组,其单元格是该对象的属性。键的名称将是成员变量的名称,但有一些例外:整数属性不可访问;私有变量将以类名作为前缀;受保护的变量将以“*”为前缀。这些前缀的前面和后面都有 NULL 字符。这可能会导致不可预测的行为:

<?php
    class A {
        private $A; // This will become '\0A\0A'
    }

    class B extends A {
        private $A; // This will become '\0B\0A'
        public $AA; // This will become 'AA'
    }

    var_dump((array) new B());
?>   

转换为对象

将对象转换为对象不会改变任何内容。如果任何其他类型的值被转换为对象,则将创建内置类 stdClass 的实例。如果值为 NULL,则新实例为空。将数组转换为对象将使键成为具有相应值的属性名称。对于任何其他值,名为 scalar 的成员变量将包含该值。

<?php
    $obj = (object) 'ciao';
    echo $obj->scalar;  // outputs 'ciao'
?> 

转换为 null

使用(未设置)$var 将变量转换为 null 不会清除该变量或使其值无效。它只是返回一个 NULL 值。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门