老大说了这个dotenv的重构比较适合用来学习,进行了分析,并分享了出来php
github项目地址: github.com/vlucas/phpd…git
dotenv是一个php写的从文件中加载环境变量的库,库自己文件数量较少,比较容易阅读。github
2.x实例化方式设计模式
$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig');
$dotenv->load();
复制代码
3.x实例化方式api
$dotenv = Dotenv\Dotenv::create(__DIR__, 'myconfig');
$dotenv->load();
复制代码
这个3.x版本create方法建立对象使用的是工厂方法设计模式数组
核心实例化dotenv对象由手动调用构造方法重构成了静态工厂方法,这个改变是由于这个dotenv加载.env文件须要判断env文件、envFactory对象是否传递,而这个判断是个if else的逻辑,根据构造方法不宜写逻辑定理,若是不使用静态工厂方法进行重构,那么在new DotEnv以前,必须手动判断.env是否存在。在屡次实例化这个Dotenv对象时,必然形成代码重复。工具
经过工厂方法封装建立对象的逻辑,以免建立对象的代码重复,是很是常见的一种设计模式的最佳实践学习
异常3.x比2.x多了InvalidCallbackExceptionspa
3.x比2.x重要的改变是多了Adapter目录,这个是由于2.x仅支持将.env使用putenv加载到环境变量中,而3.x支持将.env加载到多个环境变量中,包括设计
在使用时就能无差异对待了,这样无需调用时候的if else判断了
接口可替换设计
这些接口都是可替换的,这种面向接口的设计方式使得代码很是容易扩展