🌚

关于Lumen的Facade不支持引用传递的看法

Posted at — Feb 04, 2020
#编程 #Laravel/Lumen

今天遇到一个奇怪的问题,一次调用带引用传递形参的方法后,该形参对应的变量值没有按预期改变。

先后排除了方法声明、调用和被调方法内部逻辑的问题,唯一的可能应该是框架自身的某些因素导致的。由于该行代码的作者是通过Facade调用Service中的这个方法,所以怀疑问题可能出在Facade上。于是改用从容器中获取Service实例的方式,发现变量值是可以改变的,也进一步验证了这个猜测。

通过单步调试,发现Illuminate\Support\Facades\Facade::__callStatic()直接把所有参数的值作为一个一维数组传递给被调方法,导致被调方法中的引用传递参数在方法执行后没有被改变。

我个人的观点是,应该尽量避免使用引用传递、全局变量这种东西,所有方法和函数应该按标准的IO模型封装,甚至在Controller的方法中都不应该直接echo & die,而是应该将结果返回并由框架处理对调用方的输出行为。

保持实现方式的简单统一,从长期看可以较好地降低开发和维护成本。大道至简。