Cookie.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace Typecho;
  3. /**
  4. * cookie支持
  5. *
  6. * @author qining
  7. * @category typecho
  8. * @package Cookie
  9. */
  10. class Cookie
  11. {
  12. /**
  13. * 前缀
  14. *
  15. * @var string
  16. * @access private
  17. */
  18. private static $prefix = '';
  19. /**
  20. * 路径
  21. *
  22. * @var string
  23. * @access private
  24. */
  25. private static $path = '/';
  26. /**
  27. * @var string
  28. * @access private
  29. */
  30. private static $domain = '';
  31. /**
  32. * @var bool
  33. * @access private
  34. */
  35. private static $secure = false;
  36. /**
  37. * @var bool
  38. * @access private
  39. */
  40. private static $httponly = false;
  41. /**
  42. * 获取前缀
  43. *
  44. * @access public
  45. * @return string
  46. */
  47. public static function getPrefix(): string
  48. {
  49. return self::$prefix;
  50. }
  51. /**
  52. * 设置前缀
  53. *
  54. * @param string $url
  55. *
  56. * @access public
  57. * @return void
  58. */
  59. public static function setPrefix(string $url)
  60. {
  61. self::$prefix = md5($url);
  62. $parsed = parse_url($url);
  63. self::$domain = $parsed['host'];
  64. /** 在路径后面强制加上斜杠 */
  65. self::$path = empty($parsed['path']) ? '/' : Common::url(null, $parsed['path']);
  66. }
  67. /**
  68. * 获取目录
  69. *
  70. * @access public
  71. * @return string
  72. */
  73. public static function getPath(): string
  74. {
  75. return self::$path;
  76. }
  77. /**
  78. * @access public
  79. * @return string
  80. */
  81. public static function getDomain(): string
  82. {
  83. return self::$domain;
  84. }
  85. /**
  86. * @access public
  87. * @return bool
  88. */
  89. public static function getSecure(): bool
  90. {
  91. return self::$secure ?: false;
  92. }
  93. /**
  94. * 设置额外的选项
  95. *
  96. * @param array $options
  97. * @return void
  98. */
  99. public static function setOptions(array $options)
  100. {
  101. self::$domain = $options['domain'] ?: self::$domain;
  102. self::$secure = $options['secure'] ? (bool) $options['secure'] : false;
  103. self::$httponly = $options['httponly'] ? (bool) $options['httponly'] : false;
  104. }
  105. /**
  106. * 获取指定的COOKIE值
  107. *
  108. * @param string $key 指定的参数
  109. * @param string|null $default 默认的参数
  110. * @return mixed
  111. */
  112. public static function get(string $key, ?string $default = null)
  113. {
  114. $key = self::$prefix . $key;
  115. $value = $_COOKIE[$key] ?? $default;
  116. return is_array($value) ? $default : $value;
  117. }
  118. /**
  119. * 设置指定的COOKIE值
  120. *
  121. * @param string $key 指定的参数
  122. * @param mixed $value 设置的值
  123. * @param integer $expire 过期时间,默认为0,表示随会话时间结束
  124. */
  125. public static function set(string $key, $value, int $expire = 0)
  126. {
  127. $key = self::$prefix . $key;
  128. $_COOKIE[$key] = $value;
  129. Response::getInstance()->setCookie($key, $value, $expire, self::$path, self::$domain, self::$secure, self::$httponly);
  130. }
  131. /**
  132. * 删除指定的COOKIE值
  133. *
  134. * @param string $key 指定的参数
  135. */
  136. public static function delete(string $key)
  137. {
  138. $key = self::$prefix . $key;
  139. if (!isset($_COOKIE[$key])) {
  140. return;
  141. }
  142. Response::getInstance()->setCookie($key, '', -1, self::$path, self::$domain, self::$secure, self::$httponly);
  143. unset($_COOKIE[$key]);
  144. }
  145. }