PHP 版本切换

一直以来我在公司使用 PHP 开发都没什么阻碍，开开心心的用着 7.4 写着各种需求。直到有一天，我开始加入一个老项目参与新功能的开发……

现在就出现了我既要开发新项目，又要在老项目里面加新功能的情况.
这个老项目使用的 PHP 版本是 5.6, 有一套自己的 xampp 环境的那种。如果 5.6 和 7.4 差别不到就还好，问题是差别还有点大…… 有些语法我用习惯了，一直不自觉的在用，比如简单的 fn 匿名函数，我就经常在用，在 5.6 版本是不支持的。甚至长字符串标记都不支持...

这些问题不能在上线前才发现，最好还是和项目统一环境.

直到这里都还不算什么问题，听起来就是自己切换一下环境变量的事情。可惜在公司我是用的是 Windows 作为开发环境，这个环境变量的修改啊……

这么说吧，在 Windows 上修改环境变量，什么时候生效是不可控的.
也就是说假如我现在临时要跑到另一个版本不一样的项目改点东西，我改了下全局的环境变量，那不是重开一下终端就能生效了的，真不知道什么时候环境变量会开始刷新……

唯一一个能控制生效的手段是重启。但很多时候我并不想重启啊！我后台跑着脚本呢，或者干着其他事情呢，我不想丢失进度！

当然也有麻烦的办法，不改环境变量直接用路径也不是不行，就是特别麻烦，太多配置文件默认用环境里的 PHP 咯。还是想想办法解决这个问题吧.

这种问题其实也有成熟的解决方案了.
比如 Python, 社区里面有一款虚拟环境管理器，我之前一直在用，叫 miniconda, 它就可以很方便的控制 Python 环境的版本，一个项目就对应着一个虚拟环境.
所以我查了一下，PHP 自然也有类似的管理器。但我最终没有用…… 因为我照着教程走了一两遍，都失败了，原因没搞明白……

我简单思考了下，如果都是些我看不太明白的错，那搞明白的成本就不好说了，为了用上这个所谓的 PHPbrew 管理 PHP 版本，我至少要预留 2 小时去搞清楚到底怎么回事……
想了想，算了，不值得。为了让环境变量生效快点，我不得不引入一个这么大的环境管理器，还不如我自己花 20 分钟简单实现个脚本解决 Windows 改环境变量生效慢的问题.

于是我就自己手撸了一个 powershell 脚本放到我的 profile 里面，直接 php_version xxx 就能环境变量马上切换到我需要的 PHP 版本上去.

所以我到底使用了什么魔法，让环境变量立刻就生效了捏？

哈，答案可能让你失望了哈。我是绕过了这个问题.
既然环境变量生效慢，还不知道什么时候会刷新，那么最好就不要随意更改变量，就让它固定在那里吧。所以现在要解决的核心问题是：如何在不改变路径的情况下，让路径实际使用的 PHP 版本发生变化？

这个问题很简单，应该经常使用 Linux 的同学马上就想到了吧……

没错，我创建了一个叫 current 的文件夹软连接，软链接指向的是我当前 Windows 内默认的 PHP 环境。我的 Windows 环境变量就是指向的是这个 current 文件夹.

我的 powershell 脚本要做的事情，就是每当我调用这个函数，就把我的软链接删掉，指向我指定的新的位置.

Copy
function php_version {
param (
[Parameter(Mandatory=$true)]
[string]$version
)

$curr_php_path = "$env:PHP_HOME\current";
if (Test-Path $curr_php_path) {
Write-Host "Removing current PHP version"
cmd /c rmdir $curr_php_path
}

$target_php_path = "$env:PHP_HOME\$version";
if (!(Test-Path $target_php_path)) {
Write-Host "PHP version $version not found"
return
}

sudo New-Item -Path $curr_php_path -ItemType SymbolicLink -Value $target_php_path
Write-Host "PHP version $version set as current"
php --version
}

就这样，非常简单的实现了 PHP 版本切换的功能～

灵感其实来源于 Windows 的包管理器 scoop…… 它对软件版本的管理就是靠软链接，更新了之后新版本默认指向 current 就行了.

想起来以前我只知道 Windows 上有快捷方式，从来没有想过其实软硬链接都有的。大学时天真的我，在学习操作系统这门课的时候，以为软链接就是快捷方式，然而还是有不少区别的……

当然，这个方法局限性很大，跟 Python 那种真正的虚拟环境不一样。毕竟一改就是要改全局的嘛。现在我我不得不在启动配置上，都加上一条 php_version php7.4 才能避免忘记改回去的尴尬～

对了，推荐 Windows 上的一个插件，叫做 Link Shell Extension . 安装好这个之后，右键你的文件，就可以快速选择作为源点，然后软链硬链到你想要的地方啦，比直接在终端写命令要方便直观很多.