现在我们开始一一解读phpdotenv中的源码
首先在 bootstarp/app.php中(new Dotenv\Dotenv(DIR ))->load()
我们先来解读这一行代码的执行流程
首先是实例化了Dotenv这个类以及传入当前项目路径得到一个Dotenv类的实例,实例中的this−>getFilePath(this−>getFilePath(path,file)这个方法中就是把path与path与file拼接得到一个.env的文件地址赋值给这个实例中的filePath
第二行就是去new 一个Loader类.这个类也就是跟Dotenv类同一个目录下的,这个类主要实现了读取文件中的内容到php的ENVENV_SERVER全局变量中.
这是Loader类的构造方法,该构造方法中第二个参数主要控制不可变的变量,
接下来就是调用Dotenv中的load方法了.
load方法中继续调用了loaData()方法
在loadData方法中又获取了一下Load类的实咧,然后通过得到的load实例再去调用了Load类中的load方法.
这个方法中主要实现了整个文件的一个过滤读取 然后存入php全局变量中
现在就来一一解读下这个方法中的实现
第一行调用的ensureFileIsReadable该方法就是检查$this->filePath是否是一个文件以及是否可读.然后调用了readLinesFromFile方法
这个方法就是通过file函数读取文件中的内容,并以数组形式返回.
接下来就是遍历这个数组,最后返回.
在遍历数组当中还做了很多的一些操作,首先就是过滤.env文件中的注释行 以及不是以一种键值对的形式的数据.
最后执行setEnvironmentVariable这个方法.通过方法名能理解就是把.env中可用的配置存入到环境变量当中,我们现在来看看这个方法又做了哪些操作呢
normaliseEnvironmentVariable 方法参数$name是一个字符串
这个方法的第一个步是通过传入的字符串截取成一个数组返回分别赋值给list中的两个变量
这个sanitiseVariableValue方法看着就是去除一些字符串中的特殊符号什么已达到防止一些恶意的攻击.
改方法主要就是解析出嵌套的变量.然后回到setEnvironmentVariable方法
紧接着 当如果immutable这个变量为true时 就要去检查当前php环境中的ENVENV_SERVER getenv() 全局变量中跟php的环境变量中是否已经有这个$name值了.如果有的话就返回不往下执行了.
在接下来 方法中就是判断项目是否在apache环境下,现在基本都是使用nginx WEB服务器,所以这里就不做解释了.
最后几行就是把.env文件中的键值对 分别存入env ENV以及ENV以及_SERVER当中.