类型Juggling

PHP不需要在变量声明中进行显式类型定义。在这种情况下,变量的类型由它存储的值决定。也就是说,如果一串分配给变量$变量,然后$变量类型为一串如果之后整数已分配值$变量,它将是类型整数.

PHP可能会尝试自动将值的类型转换为另一种类型在某些情况下。存在的不同背景包括:

  • 数字
  • 字符串
  • 逻辑
  • 积分和字符串
  • 比较
  • 功能

注释:当需要将值解释为不同类型时,值本身更改类型。

要强制将变量计算为特定类型,请参阅类型铸件。要更改变量的类型,请参见设置类型()功能。

数字上下文

这是使用算术运算符.

在这种情况下,如果任一操作数是浮动(或不)可解释为整数),两个操作数都解释为浮动s、 结果将是浮动.否则,操作数将解释为整数第页,结果也将是整数.从PHP 8.0.0开始,如果其中一个操作数不能解释为类型错误被抛出。

字符串上下文

这是使用时的上下文回声,打印,字符串插值,或者字符串串联运算符.

在这种情况下,该值将被解释为一串.如果无法解释该值,则类型错误被抛出。在PHP 7.4.0之前E_可恢复_ERROR已提出。

逻辑上下文

这是使用条件语句时的上下文三元运算符,或a逻辑运算符.

在这种情况下,该值将被解释为布尔.

积分和字符串上下文

这是使用时的上下文定义的位运算.

在此上下文中,如果所有操作数都是类型一串结果也将是一串.否则,操作数将解释为整数第页,结果也将是整数.从PHP 8.0.0开始,如果其中一个操作数不能解释为类型错误被抛出。

比较上下文

这是使用比较运算符.

此上下文中发生的类型转换在与各种类型的比较桌子.

函数上下文

这是将值传递给类型化参数、属性、,或从声明返回类型的函数返回。

在此上下文中,值必须是类型的值。存在两个例外,第一个例外是:如果值的类型为整数声明的类型为浮动,然后是整数转换为浮点数。第二个是:如果声明的类型是标量类型,该值可转换为标量类型,强制输入模式有效(默认值),则该值可以转换为可接受的标量值。有关此行为的描述,请参见下文。

警告

内部功能自动强制无效的到标量类型,这种行为是已弃用自PHP 8.1.0起。

带有简单类型声明的强制类型

使用联合类型强制类型

什么时候?严格类型未启用,标量类型声明受到有限的隐式类型胁迫。如果值的确切类型不是联合的一部分,则目标类型按以下优先顺序选择:

  1. 整数
  2. 浮动
  3. 一串
  4. 布尔
如果联合中存在该类型,并且该值可以强制为在PHP现有的类型检查语义下键入,然后选择类型。否则,将尝试下一种类型。

注意安全

作为例外,如果值是字符串并且int和float都是部分在联合中,首选类型由现有的数字字符串语义。例如,对于"42" 整数被选中,而对于"42.0" 浮动被选中。

注释:

不属于上述首选项列表的类型不合格隐式强制的目标。特别是没有对这个无效的,、和真实的类型发生。

示例#1强制类型成为联合的类型部分的示例

<?php(电话)
//int |字符串
42-->42//精确类型
"42"-->"42"//精确类型
新的带有ToString的对象-->“__toString()的结果”
//对象与int不兼容,回退到字符串
42-->42//float与int兼容
42.1-->42//float与int兼容
1e100-->“1.0E+100”//浮点值对于int类型太大,回退到字符串
INF(信息)-->“INF”(信息)//浮点值对于int类型太大,回退到字符串
真实的-->1//bool与int兼容
[] -->类型错误//数组与int或string不兼容

//int|float|bool
"45"-->45//int数字字符串
"45.0"-->45//浮点数字字符串

“45倍”-->真实的//不是数字字符串,返回bool
""-->//不是数字字符串,返回bool
“X”-->真实的//不是数字字符串,返回bool
[] -->类型错误//数组与int、float或bool不兼容
?>

类型铸件

类型转换通过在中写入类型将值转换为所选类型要转换的值前的括号。

<?php(电话)
$foo美元
=10;//$foo是一个整数
$巴=(布尔)$foo美元;//$bar是布尔值
?>

允许的强制转换包括:

  • (整数)-强制转换为整数
  • (布尔)-强制转换为布尔
  • (浮动)-强制转换为浮动
  • (字符串)-强制转换为一串
  • (数组)-强制转换为阵列
  • (对象)-强制转换为对象
  • (未设置)-强制转换为无效的

注释:

(整数)是的别名(整数)演员。(布尔值)是的别名(布尔)演员。(二进制)是的别名(字符串)演员。(双倍)(真实)是的别名这个(浮动)演员。这些类型转换不使用规范类型名称,因此不建议使用。

警告

这个(真实)自PHP 8.0.0起,强制转换别名已被弃用。

警告

这个(未设置)自PHP 7.2.0起,强制转换已被弃用。请注意(未设置)强制转换与分配价值无效的变量或调用。这个(未设置)自PHP 8.0.0起,强制转换已删除。

注意安全

这个(二进制)铸造和b条前缀已存在用于向前支撑。目前(二进制)(字符串)相同,但这可能会改变不应依赖。

注释:

在类型转换的括号中忽略空白。因此,以下两种类型转换是等效的:

<?php(电话)
$foo美元
=(整数)$巴;
$foo美元=(整数)$巴;
?>

强制转换文字一串s和变量转换为二进制一串秒:

<?php(电话)
$二进制
=(二进制)$string($string);
$二进制=b“二进制字符串”;
?>

注释:而不是将变量强制转换为一串,这也是可能的将变量括在双引号中。

<?php(电话)
$foo美元
=10;//$foo是一个整数
$str(美元)="$foo美元";//$str是一个字符串
$fst(美元)=(字符串)$foo美元;//$fst也是一个字符串

//这打印出“他们是一样的”
如果($fst(美元)===$str(美元)) {
回声
“它们是一样的”;
}
?>

在特定的类型。有关更多信息,请参阅以下部分:

注释:因为PHP支持索引到一串s通过偏移使用与相同的语法阵列索引,以下示例适用于所有PHP版本:

<?php(电话)
美元
=“汽车”;//$a是一个字符串
美元[0] =“b”;//$a仍然是字符串
回声美元;//酒吧
?>
请参阅标题为字符串按字符访问了解更多信息。

添加注释

用户贡献的笔记7条注释

拉贾
19年前
整数变量与另一个整数变量的不均匀除法将导致通过自动转换产生浮点数--您不必将变量强制转换为浮点数以避免整数截断(例如,在C中):

$股息=2;
$除数=3;
$商=$被除数/$除数;
打印$quotient;//0.66666666666667
法拉第人
11年前
将对象转换为数组是一件痛苦的事情。例子:

<?php(电话)

类名{

私有的
$优先='主值';
受保护的
$prot美元='保护值';
公众的
$pub(美元)='发布值';
公众的
$MyClasspriv公司='第二个pub_value';

}

$测试=新类名();
回声
“<前>”;
打印(r)((数组)$测试);

/*
阵列
(
[MyClasspriv]=>隐私值
[*prot]=>保护值
[pub]=>pub_value
[MyClasspriv]=>第二个pub_value
)
*/

?>

是的,这看起来像是一个有两个同名键的数组,而且受保护的字段前面加了一个星号。但事实并非如此:

<?php(电话)

foreach((数组)$测试作为$键=>价值$) {
单位:美元=斯特伦($键);
回声
"{$键}({美元}) =>{价值$}<br/>“;
的(
1美元=0;$i美元<单位:美元; ++1美元) {
回声
($键[1美元]) .' ';
}
回声
“<小时/>”;
}

/*
MyClasspriv(13)=>priv_value
0 77 121 67 108 97 115 115 0 112 114 105 118
*保护(7)=>保护值
0 42 0 112 114 111 116
pub(3)=>pub_value
112 117 98
MyClasspriv(11)=>second_pub_value
77 121 67 108 97 115 115 112 114 105 118
*/

?>

字符代码显示受保护的密钥以“\0*\0”开头,私钥以“\0”结尾__类别__.'\0'所以在玩这个时要小心。
匿名
3年前
强制转换操作符具有很高的优先级,例如,(int)$a/$b的计算结果为((int)$a)/$b,而不是(int)($a/$b)[如果$a和$b都是整数,则类似于intdiv($a,$b)]。
唯一的例外(从PHP 8.0开始)是求幂运算符**[即,(int)$a**$b被计算为(int)($a**$b)而不是(int)$a)**$b],以及特殊的访问/调用运算符->、::、[]和()[即,在(int)$1->$b、(int)#a::$b、。
百分之一点的奇迹
18年前
如果要将字符串自动转换为浮点或整数(例如,将“0.234”转换为浮点,将“123”转换为int),只需在字符串中添加0即可,剩下的由PHP完成。

例如

$val=0+“1.234”;
($val的类型现在为float)

$val=0+“123”;
($val的类型现在是整数)
米拉贝尔
13年前
这里提供的对象强制转换方法没有考虑您试图将对象强制转换到的类的类层次结构。

/**
*将对象转换为特定类。
*@param对象$object
*@param string$class_name要将对象强制转换到的类
*@return对象
*/
公共静态函数转换($object,$class_name){
如果($object===false)返回false;
if(类存在($class_name)){
$ser_object=序列化($object);
$obj_name_len=字符串(get_class($object));
$start=$obj_name_len+strlen($obj_name_len)+6;
$new_object=“O:”。strlen($class_name)。':“'.$class_name.'”:';
$新对象=substr($ser_object,$start);
$new_object=取消序列化($new_object);
/**
*新对象的类型正确,但
*未在其整个图形中完全初始化。
*获取完整对象图(包括父对象
*类数据,我们需要创建
*指定的类,然后分配新的
*属性。
*/
$graph=新的$class_name;
foreach($new_object作为$prop=>$val){
$graph->$prop=$val;
}
返回$graph;
}其他{
抛出新的CoreException(false,“在DB::cast中找不到用于casting的类$class_name”);
返回false;
}
}
匿名
21年前
打印或回显FALSE布尔值或NULL值会导致空字符串:
(string)TRUE//返回“1”
(string)FALSE//返回“”
echo TRUE//打印“1”
echo FALSE//什么都没印!
ieee在REMOVE dot bk dot ru
11年前
有一些更短更快的方法(至少在我的机器上)来执行类型转换。
<?php(电话)
$string($string)
='12345.678';
浮动美元=+$string($string);
$整数=0|$string($string);
$布尔值=!!$string($string);
?>
到顶部