应使用 wsdltophp/packagegenerator 工具,通过 composer require --dev wsdltophp/packagegenerator 安装,再用 vendor/bin/wsdltophp generate:package --urlorpath=... --destination=... 生成客户端类,并手动配置 autoload。

确认要用的是 wsdltophp/packagegenerator,不是其他同名包
Composer 上搜 “wsdl php” 会出来一堆名字相近的包,比如 piotrooo/wsdl-creator(用于生成 WSDL)、meng-tian/php-soap-interpreter(用于解析原始 SOAP 消息),但你要的是“根据 WSDL 生成 PHP 客户端类”的工具——唯一被广泛验证、持续维护、且支持复杂类型/命名空间/枚举的,是 wsdltophp/packagegenerator。别装错,否则生成的代码缺方法、漏字段,调试半天才发现是包选错了。
安装命令要带 --dev,生成器本身不参与运行时
这个包只在开发阶段用:读 WSDL、写 PHP 类、输出 SDK 目录。它不会出现在你的生产代码里,也不需要 autoload 运行。所以推荐加 --dev 标记:
composer require --dev wsdltophp/packagegenerator
如果不加,它会被写进 require 而非 require-dev,后续部署时可能被误打包或触发不必要的 autoloader 扫描。
生成命令必须指定 --urlorpath 和 --destination
vendor/bin/wsdltophp 命令不能省略关键参数,常见失败就卡在这两处:
立即学习“PHP免费学习笔记(深入)”;
-
--urlorpath:填本地路径(如./wsdl/service.wsdl)或远程 URL(如https://api.example.com?wsdl)。注意 URL 必须能被 PHP 的file_get_contents或 cURL 正确获取,含重定向或需鉴权的地址会失败 -
--destination:目标目录必须为空或不存在,否则报错;建议用新目录名,比如./src/SoapClient,避免覆盖已有代码 -
--composer-name是可选的,但建议填,比如acme/soap-api,它会写进生成包的composer.json,方便你后续作为子模块复用
完整示例:
vendor/bin/wsdltophp generate:package --urlorpath="./wsdl/payment.wsdl" --destination="./src/PaymentSoap" --composer-name="acme/payment-soap"
生成后要手动加载,不是自动注册到 Composer autoloader
生成的 SDK 是一个独立的“包结构”,含自己的 composer.json 和 src/ 目录。它不会自动被主项目的 autoloader 识别。你有两个选择:
- 把生成目录加进主项目
composer.json的"autoload": {"psr-4": {...}}里(推荐),例如:"Acme\PaymentSoap\": "src/PaymentSoap/src/" - 或者直接在使用前
require_once生成目录下的autoload.php(不推荐,破坏 Composer 管理逻辑)
别忘了跑 composer dump-autoload 让新映射生效。漏这步,new AcmePaymentSoapStructTypePayRequest() 就会报 Class not found。
targetNamespace 和类型定义决定,不是固定格式。如果 WSDL 里 namespace 是空或非法字符,生成的 PHP 类可能无法正确命名——这种问题只能改 WSDL 或用 --namespace 参数手动覆盖,但得同步调整所有调用点。



















