php强制类型转换用括号语法如(int)、(bool),不改变原变量;(int)字符串时从头截取数字,对象转数组仅含public属性,isset()检查存在性而(bool)只转值。

PHP中强制转换变量类型的写法
PHP支持用括号包裹类型名的方式做强制类型转换,这是最常用、最直接的方法。它不是函数调用,不改变原变量,只返回新类型的值。
-
(int)、(integer)效果相同,转整型(截断小数,非四舍五入) -
(bool)或(boolean):空字符串、0、0.0、null、空数组转为false,其余基本为true -
(string):数字转字符串时无歧义,但资源、对象会触发 Notice 或返回固定字符串(如"Resource id #123") -
(array):标量转数组会包一层,null转成空数组,对象转数组会把 public 属性变成键值对
为什么 (int) "123abc" 得到 123 而不是报错
PHP的类型转换是“宽松”的,(int) 会从字符串开头尽可能解析数字,遇到非数字字符就停。这不是 bug,是设计行为。
-
(int) "123abc"→123 -
(int) "abc123"→0(开头无数字) -
(int) " 456 "→456(自动 trim 空格) - 若需严格校验,应先用
is_numeric()或正则,再转换
isset() 和 (bool) 在判断真假时的区别
两者目的相似,但机制完全不同:isset() 检查变量是否存在且不为 null;(bool) 是纯值转换,不关心变量是否定义。
-
var_dump((bool) $undefined);→ 触发 Notice:Undefined variable -
var_dump(isset($undefined));→false,无警告 -
isset($x)不等价于(bool) $x:比如$x = 0,isset($x)为true,(bool) $x为false - 判断“有值且为真”要组合使用,比如
isset($x) && $x
对象转数组时 public 属性以外的内容去哪了
用 (array) 强转对象,只会把 public 属性转为数组元素。protected 和 private 属性会被加上类名前缀(不可见字符包裹),实际存在但难以访问。
立即学习“PHP免费学习笔记(深入)”;
-
(array) new StdClass()→[] - private 属性
$foo在转出数组里键名为"\0*\0foo",不是普通字符串 - 想完整导出对象结构,用
get_object_vars()更安全(只返回 public) - 需要序列化/传输时,优先考虑
json_encode()或自定义JsonSerializable接口
类型转换看着简单,但隐含行为很多:字符串开头解析、对象属性可见性、null 和 0 的真假混淆……真正写业务时,别依赖自动转换,该校验的校验,该断言的断言。











