Env.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. /**
  3. * 环境变量
  4. *
  5. * @author mybsdc <[email protected]>
  6. * @date 2019/6/2
  7. * @time 17:28
  8. */
  9. namespace Luolongfei\Libs;
  10. use Dotenv\Dotenv;
  11. class Env extends Base
  12. {
  13. /**
  14. * @var array 环境变量值
  15. */
  16. protected $allValues = [];
  17. public function init($filename = '.env', $overload = false)
  18. {
  19. if (file_exists(ROOT_PATH . DS . $filename)) {
  20. $this->setAllValues($filename, $overload);
  21. } else { // 云函数或 Heroku 或 Railway 直接从 .env.example 读取默认环境变量
  22. $this->setAllValues('.env.example', $overload);
  23. }
  24. }
  25. /**
  26. * 读取并设置所有环境变量
  27. *
  28. * @param $filename
  29. * @param $overload
  30. *
  31. * @return void
  32. */
  33. private function setAllValues($filename, $overload)
  34. {
  35. $dotenv = $overload
  36. ? Dotenv::createUnsafeMutable(ROOT_PATH, $filename)
  37. : Dotenv::createUnsafeImmutable(ROOT_PATH, $filename);
  38. $this->allValues = $dotenv->load();
  39. }
  40. /**
  41. * 获取环境变量
  42. *
  43. * @param $key
  44. * @param $default
  45. *
  46. * @return array|bool|mixed|string|null
  47. */
  48. public function get($key = '', $default = null)
  49. {
  50. if (!strlen($key)) { // 不传 key 则返回所有环境变量
  51. return $this->allValues;
  52. }
  53. $value = getenv($key);
  54. if ($value === false) {
  55. return $default;
  56. }
  57. switch (strtolower($value)) {
  58. case 'true':
  59. case '(true)':
  60. return true;
  61. case 'false':
  62. case '(false)':
  63. return false;
  64. case 'empty':
  65. case '(empty)':
  66. return '';
  67. case 'null':
  68. case '(null)':
  69. return null;
  70. }
  71. if (($valueLength = strlen($value)) > 1 && $value[0] === '"' && $value[$valueLength - 1] === '"') { // 去除双引号
  72. return substr($value, 1, -1);
  73. }
  74. return $value;
  75. }
  76. }