PHP 5.3 中唯一安全的空数组定义方式是 array(),如 $params = array(); $header = array(); $body = array('username' => '', 'password' => '');,因不支持 [] 语法且 SOAP 接口要求严格类型,null 会导致序列化异常或服务端报错。

PHP 5.3 不支持 [] 短数组语法,因此在对接老系统(如某些电信、政务类 SOAP 接口)时,若运行环境锁定在 PHP 5.3,必须使用兼容写法定义空数组,否则会直接报错 Parse error: syntax error, unexpected '['。
必须用 array(),不能用 []
PHP 5.3 中唯一安全的空数组定义方式是:
-
$params = array();—— 明确、稳定、全版本兼容 -
$header = array();—— 尤其用于 SOAP 请求头构造 -
$body = array('username' => '', 'password' => '');—— 关联数组也必须用array()包裹
SOAP 调用中空数组的典型用途
很多旧版 WSDL 接口要求传入结构化参数,即使某字段为空,也需显式传递空数组而非 null 或省略:
- 请求体中「附件列表」字段为
ArrayOfString类型,但本次无附件 → 传array() - 用户权限组字段定义为
string[],但该用户暂未分配权限 → 仍需array(),不可传null - 调用
__soapCall()时,第二个参数必须是数组,哪怕无参数也要写成array()
避免与 null 混淆的关键细节
SOAP 协议对数据类型敏感,array() 和 null 在序列化后生成的 XML 完全不同:
立即学习“PHP免费学习笔记(深入)”;
-
array()→ 生成空标签或空集合节点(如<items/>或<items xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"></items>) -
null→ 可能被忽略、转为空字符串,或触发服务端校验失败 - 实测某省社保接口:传
null报错Invalid Array type,改用array()后正常
动态追加元素仍要保持语法统一
在 PHP 5.3 中向数组追加值,不能用 $arr[] = $val 的简写(虽然它其实可用,但为保持风格一致和避免混淆,建议显式指定下标或继续用 array_push()):
- 推荐:
array_push($params, 'value'); - 也可:
$params[] = 'value';(PHP 5.3 支持该语法,但注意不是[]定义数组) - 不推荐混用:
$params = [];(语法错误) +$params[] = ...(无效)



















