Behat 4 不支持 PHP 7.4,必须使用 behat/behat:^3.12;因官方要求 PHP ≥ 8.0,v4 使用联合类型等新语法,PHP 7.4 下安装失败或运行时报 TypeError,配套扩展如 mink-extension 也需对应 v2.x 版本。

Behat 4 不支持 PHP 7.4 —— 这是必须先确认的核心事实。官方明确要求 PHP ≥ 8.0,且 behat/behat:^4.0 在 PHP 7.4 下安装会失败或运行时抛出 Fatal error: Uncaught TypeError(比如因使用了 PHP 8.0+ 的联合类型、构造器属性提升等语法)。
你如果用的是 PHP 7.4,只能用 behat/behat:^3.12,这是最后一个兼容 PHP 7.4–8.1 的稳定版。v4 是彻底放弃旧版本的分水岭。
为什么 composer require behat/behat:^4 在 PHP 7.4 下会失败
Composer 安装时会直接拒绝:它读取 behat/behat:^4 的 composer.json,发现 "php": "^8.0" 约束不满足当前环境,报错类似:
Root composer.json requires behat/behat ^4, found behat/behat[dev-main, 4.0.0-BETA1, ..., 4.13.0] but these were not loadable due to conflicts with your PHP version 7.4.33.
- 不是“能装但跑不动”,而是根本不会进入安装流程
- 即使强制加
--ignore-platform-reqs,后续运行./vendor/bin/behat也会在加载类时崩溃(如Behat\Testwork\Call\CallCenter使用了mixed类型) -
behat/mink-extension等常用扩展也已同步升级依赖,v2.x 才适配 Behat 3,v3.x 要求 Behat 4
PHP 7.4 项目该用哪个 Behat 版本和写法
锁定 behat/behat:^3.12,并确保配套组件版本对齐:
立即学习“PHP免费学习笔记(深入)”;
- 在
composer.json中显式写:"behat/behat": "^3.12"(不要只写^3,避免意外升到不兼容的 3.13+) - 若需浏览器交互,用
behat/mink-extension:^2.3+mink/goutte-driver:^1.2 -
features/bootstrap/FeatureContext.php继承Behat\Behat\Context\Context,不是Behat\Behat\Context\Attribute\AsContext(那是 v4 的) - Gherkin 步骤绑定仍用
@Given/@When/@Then注解,正则写法不变,例如:@Given /^I am on "([^"]*)"$
示例最小可行步骤定义:
use Behat\Behat\Context\Context;
<p>class FeatureContext implements Context
{
/**</p><ul><li>@Given I am on :path
*/
public function iAmOn($path)
{
// 实际逻辑,比如 $this->getSession()->visit($path)
}
}
behat.yml 配置在 Behat 3 和 4 的关键差异
v3 的配置更宽松,v4 强制要求 suites 结构;PHP 7.4 下必须用 v3 风格:
- v3 允许扁平配置:
default: contexts: [FeatureContext] - v4 必须嵌套:
default: suites: default: contexts: [FeatureContext],否则报Invalid configuration - v3 默认启用
pretty格式器;v4 默认是progress,但 PHP 7.4 下你压根用不到 - 别在 v3 项目里复制 v4 的
formatters:块,尤其带html:或json:的——v3 不识别,直接退出
一个安全的 PHP 7.4 兼容配置片段:
default:
suites:
default:
paths:
features: features
bootstrap: features/bootstrap
contexts:
- FeatureContext容易被忽略的兼容性陷阱
最常踩的坑不在代码,而在开发机和 CI 环境的隐性不一致:
- 本地 PHP 是 7.4,但 CI 流水线用了 8.1,
composer install拉到了behat/behat:4.x,测试通过,上线却崩 —— 必须锁死composer.lock并检查其中behat/behat的实际版本 - 团队有人全局安装了
behat/behat(composer global require),PATH 里优先调用的是全局 v4,导致behat --version显示 4.x,但项目里vendor/bin/behat是 v3 —— 永远用./vendor/bin/behat执行 - 从旧项目复制
FeatureContext.php时,忘了删掉 v4 引入的use Behat\Behat\Context\Attribute\AsContext;,PHP 7.4 解析失败
真正要盯住的,从来不是“怎么写故事”,而是“哪个版本能在你的 PHP 上活下来”。



















