php数据类型需按场景选用:整型用于数值运算,字符串用于文本处理,数组用于键值集合,对象用于封装状态与行为;类型混淆易致==与===逻辑错误,应优先用is_*函数而非gettype判断类型。

PHP数据类型不是靠“记忆列表”来用的,而是靠「什么时候该用什么类型」来判断的。整型、字符串、数组、对象这四类最常混用,但它们的底层行为、内存表现和比较逻辑完全不同——搞错一个,== 和 === 就会给你埋雷。
整型 vs 字符串:数字字符串不是数字
看似是数字的字符串(比如 "123")在 PHP 中仍是 string 类型,不会自动变成 int,除非你显式转换或触发隐式转换。
-
"123" == 123返回true(松散比较,会转类型) -
"123" === 123返回false(严格比较,类型不同直接否决) -
is_int("123")返回false;is_string(123)返回false - 用
(int)"123"或intval("123")才能安全转整型;但intval("123abc")会截断为123,而(int)"abc123"得0 - 数据库字段是
VARCHAR但存纯数字时,PHP 接收后默认是字符串——别直接拿去算术运算
数组不是对象:没有方法,只有函数操作
数组是 PHP 最常用的复合类型,但它不是对象,不能调用方法(比如 $arr->push() 会报错),所有操作都靠函数完成。
-
count($arr)获取长度,不是$arr->length或$arr->count() - 键名可以是整数、字符串甚至
null(会被转成空字符串),但foreach遍历时顺序取决于插入顺序,不是自然排序 -
array_merge([1], ["a" => "x"])会重置数字键,而+运算符保留左边键名,不覆盖已存在键 -
json_encode($arr)输出的是 JSON 字符串,不是对象字面量;解码后默认是array,加第二个参数true才保持数组结构 - 空数组
[]在布尔上下文中是true(注意:它不是false!只有null、0、""、false等才为假)
对象有状态,数组只是容器
对象是类的实例,自带属性和方法,能封装行为;数组只是键值对集合,没有逻辑。
- 对象属性访问用
->(如$obj->name),数组用[](如$arr["name"]) - 对象可被序列化(
serialize($obj)),但若含资源(如文件句柄)会丢失;数组序列化无此限制 -
clone $obj创建深拷贝(浅拷贝需手动处理引用属性),而$arr2 = $arr1是值复制(PHP 7.4+ 对大数组有优化,但语义仍是复制) - 对象可实现
__toString()让echo $obj输出自定义内容;数组不行,直接echo会警告 - 判断是否对象用
is_object($var),不能用gettype($var) === "object"—— 某些扩展返回的可能是伪对象
类型检测别只靠 gettype(),优先用 is_*() 系列
gettype() 返回字符串(如 "integer"),但易受类型转换干扰;is_int() 等函数才是语义明确的判断方式。
-
is_int(123)→true;is_int("123")→false;is_numeric("123")→true(但"12.3"也返回true,不等于整型) -
is_array([])安全;但gettype([]) === "array"虽然成立,一旦变量是null或对象,gettype()返回"NULL"或"object",容易漏判 -
is_object(new stdClass())是唯一可靠方式;不要用get_class($var)判对象——$var为null会警告 - 检查变量是否「既是数组又非空」,写
is_array($var) && !empty($var),别只用!empty($var)—— 对象、数字、字符串都可能非空但不是数组
真正容易被忽略的,是「类型边界模糊处」:比如从 JSON 解码得到的 stdClass 对象,看起来像数组但不能用 count();又比如数据库返回的整数字段,在 PDO 默认设置下可能是字符串——这些地方不加类型校验,上线后就是静默错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











