一、属性
1. $_port 端口号
2. $_securePort 端口号(安全连接)
3. $_contentType 内容类型
4. $_languages 语言
//端口号
private $_port;
//端口号(安全连接)
private $_securePort;
//内容类型
private $_contentTypes;
//语言
private $_languages;
二、方法
1. getPort方法,返回端口号
// 返回端口号
public function getPort()
{
if ($this->_port === null) {
$serverPort = $this->getServerPort();
$this->_port = !$this->getIsSecureConnection() && $serverPort !== null ?
$serverPort : 80;
}
return $this->_port;
}
2. setPort方法,设置端口号
//设置端口
public function setPort($value)
{
if ($value != $this->_port) {
$this->_port = (int) $value;
$this->_hostInfo = null;
}
}
3. getSecurePort方法,返回端口号(安全连接)
// 端口号(安全连接)
public function getSecurePort()
{
if ($this->_securePort === null) {
$serverPort = $this->getServerPort();
$this->_securePort = $this->getIsSecureConnection() && $serverPort !== null ?
$serverPort :
443;
}
return $this->_securePort;
}
4. setSecurePort方法,设置端口号(安全连接)
//设置端口号(安全连接)
public function setSecurePort($value)
{
if ($value != $this->_securePort) {
$this->_securePort = (int) $value;
$this->_hostInfo = null;
}
}
5. getAcceptableContentTypes方法,返回可接受的内容类型
// 解析Accept请求头
public function getAcceptableContentTypes()
{
if ($this->_contentTypes === null) {
if ($this->headers->get('Accept') !== null) {
$this->_contentTypes = $this->parseAcceptHeader(
$this->headers->get('Accept')
);
} else {
$this->_contentTypes = [];
}
}
return $this->_contentTypes;
}
6. setAcceptableContentTypes方法,设置可接受的内容类型
// 设置可接受的内容类型
public function setAcceptableContentTypes($value)
{
$this->_contentTypes = $value;
}
7. getContentType方法,返回内容类型
//请求的内容类型
public function getContentType()
{
if (isset($_SERVER['CONTENT_TYPE'])) {
return $_SERVER['CONTENT_TYPE'];
}
//fix bug https://bugs.php.net/bug.php?id=66606
// 请求头中获取
return $this->headers->get('Content-Type');
}
8. getAcceptableLanguages方法,终端用户的可接受的语言列表
// 终端用户可接受的语言列表
public function getAcceptableLanguages()
{
if ($this->_languages === null) {
if ($this->headers->has('Accept-Language')) {
$this->_languages = array_keys(
$this->parseAcceptHeader(
$this->headers->get('Accept-Language')
)
);
} else {
$this->_languages = [];
}
}
return $this->_languages;
}
9. setAcceptableLanguages方法,设置语言列表
// 设置语言列表
public function setAcceptableLanguages($value)
{
$this->_languages = $value;
}
10. parseAcceptHeader方法,解析Accept或Accept-language请求头
//解析“Accept”(或“Accept- language”)请求头
public function parseAcceptHeader($header)
{
$accepts = [];
foreach (explode(',', $header) as $i => $part) {
$params = preg_split('/\s*;\s*/', trim($part), -1, PREG_SPLIT_NO_EMPTY);
if (empty($params)) {
continue;
}
$values = [
'q' => [$i, array_shift($params), 1],
];
foreach ($params as $param) {
if (strpos($param, '=') !== false) {
list($key, $value) = explode('=', $param, 2);
if ($key === 'q') {
$values['q'][2] = (float) $value;
} else {
$values[$key] = $value;
}
} else {
$values[] = $param;
}
}
$accepts[] = $values;
}
usort($accepts, function ($a, $b) {
$a = $a['q']; // index, name, q
$b = $b['q'];
if ($a[2] > $b[2]) {
return -1;
}
if ($a[2] < $b[2]) {
return 1;
}
if ($a[1] === $b[1]) {
return $a[0] > $b[0] ? 1 : -1;
}
if ($a[1] === '*/*') {
return 1;
}
if ($b[1] === '*/*') {
return -1;
}
$wa = $a[1][strlen($a[1]) - 1] === '*';
$wb = $b[1][strlen($b[1]) - 1] === '*';
if ($wa xor $wb) {
return $wa ? 1 : -1;
}
return $a[0] > $b[0] ? 1 : -1;
});
$result = [];
foreach ($accepts as $accept) {
$name = $accept['q'][1];
$accept['q'] = $accept['q'][2];
$result[$name] = $accept;
}
return $result;
}
11. getPreferredLanguage方法,返回首选项语言
// 返回首选语言
public function getPreferredLanguage(array $languages = [])
{
if (empty($languages)) {
return Yii::$app->language;
}
foreach ($this->getAcceptableLanguages() as $acceptableLanguage) {
$acceptableLanguage = str_replace('_', '-', strtolower($acceptableLanguage));
foreach ($languages as $language) {
$normalizedLanguage = str_replace('_', '-', strtolower($language));
if (
$normalizedLanguage === $acceptableLanguage // en-us==en-us
|| strpos($acceptableLanguage, $normalizedLanguage . '-') === 0 // en==en-us
|| strpos($normalizedLanguage, $acceptableLanguage . '-') === 0 // en-us==en
) {
return $language;
}
}
}
return reset($languages);
}
12. getETags方法,解析ETag头
// Etags
public function getETags()
{
if ($this->headers->has('If-None-Match')) {
return preg_split(
'/[\s,]+/',
str_replace(
'-gzip',
'',
$this->headers->get('If-None-Match'
)
), -1, PREG_SPLIT_NO_EMPTY);
}
return [];
}
总结:
阅读了4个属性和12个方法:
- $_port 端口号
- $_securePort 端口号(安全连接)
- $_contentType 内容类型
- $_languages 语言
- getPort方法,返回端口号
- setPort方法,设置端口号
- getSecurePort方法,返回端口号(安全连接)
- setSecurePort方法,设置端口号(安全连接)
- getAcceptableContentTypes方法,返回可接受的内容类型
- setAcceptableContentTypes方法,设置可接受的内容类型
- getContentType方法,返回内容类型
- getAcceptableLanguages方法,终端用户的可接受的语言列表
- setAcceptableLanguages方法,设置语言列表
- parseAcceptHeader方法,解析Accept或Accept-language请求头
- getPreferredLanguage方法,返回首选项语言
- getETags方法,解析ETag头