php基础语法核心是变量(强制$前缀、大小写敏感)、表达式(==与===类型转换差异)、控制流(数组键隐式归一化)和函数(默认值传递、引用需显式声明),需时刻确认值的实际类型。

PHP 基础语法不是“背知识点”,而是围绕变量、表达式、控制流和函数这四块写能跑通的代码——不理解 $ 符号的强制性、== 与 === 的隐式转换陷阱、或数组键的松散匹配逻辑,写出来的代码大概率在条件分支里悄悄出错。
变量声明必须带 $,且区分大小写
PHP 不允许省略 $ 声明变量,漏写会直接变成未定义常量(触发 E_NOTICE 或 E_WARNING),而不是报错终止:
-
$name = "Alice";✅ 正确 -
name = "Alice";❌ 解析为常量name,若未定义则警告并当作字符串字面量处理(PHP 8.0+ 默认报Warning: Undefined constant "name") -
$Name和$name是两个不同变量 —— 函数参数、全局变量、类属性全部遵循此规则 - 变量名不能以数字开头,但可以包含下划线和字母,比如
$_config合法,$1user非法
== 和 === 的类型转换行为差异极大
用 == 比较时,PHP 会自动做类型转换(比如把字符串 "0" 转成整数 0,再跟布尔 false 对比),结果常违反直觉:
-
0 == false→true -
"0" == false→true(字符串转整数得0,再转布尔为false) -
"1" == true→true,但"1" === true→false - 数据库查询结果、
$_GET参数、JSON 解析后的字段几乎全是字符串,用==判等极易误判;生产环境一律优先用=== - 例外:判断是否为 falsy 值(如空数组、null、0、"")可用
!$var,但需明确你真需要的是“falsy”而非“strictly false”
数组键的字符串/数字自动归一化是隐形坑
PHP 数组对键做隐式类型归一:数字字符串(如 "123")会被转成整数键,而纯字母字符串保留原样:
$arr = ["123" => "a", 123 => "b"];
var_dump($arr); // 输出 array(1) { [123]=> string(1) "b" } —— 键被合并了
-
array_key_exists("123", $arr)返回true,因为键已转为整数123 -
isset($arr["123"])却返回false(isset不做类型转换) - 从 JSON 解析来的对象转数组后,所有键都是字符串,哪怕看起来像数字;用
foreach遍历时没问题,但用[]取值前最好先array_keys()看一眼实际键类型 - 避免依赖键的“外观”,显式用
(string)$key或(int)$key转换后再操作
函数参数默认按值传递,引用传递必须显式声明
PHP 函数默认复制变量值传入,修改形参不影响实参 —— 这点和 JavaScript 类似,但和 Python 的“可变对象传引用”直觉不同:
-
function addOne($x) { $x++; }中修改$x不会影响调用方的变量 - 要真正修改原始变量,必须在函数定义和调用两处都加
&:function addOne(&$x) { $x++; },调用时addOne($num) - 对象(
new StdClass或自定义类实例)默认是“对象引用传递”,但本质仍是按值传递对象标识符(handle),所以$obj->prop = ...会生效,而$obj = new OtherClass()不会改变外部变量指向 - 不要对内置函数(如
sort()、array_push())加&,它们内部已有明确设计;乱加会导致Strict Standards警告
真正卡住人的从来不是“有没有学过语法”,而是调试时发现 if ($status == "active") 在某些请求里跳过了,翻半天才发现 $status 其实是 " active "(带空格)或者 1(数据库存的 tinyint),而 == 默默做了转换。写 PHP,得随时问自己:这个值此刻的类型到底是什么?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











