设计模式
PHP面向对象
-
模块化:
-
说明:
- 类可以说的是有共同特征对象的集合,其中的“共同性”并不是只这些对象是相同的,而说它们都处理共同问题
- 把问题分解为子问题,这个过程就是模块化
-
目的:
- 解决比较复杂的问题的某一个方面,这也就就是所谓的单一职责原则
-
解释例子:
- 问题:判断客户端设备类型,从而区分是移动端还是PC端
-
步骤:
- 分析:如何判断区分?常见设备有哪些?怎么写?怎么写更好更利于维护?
-
实现:
- 利用PHP中的$_SERVER['HTTP_USER_AGENT']、$_SERVER['HTTP_X_WAP_PROFIle']、$_SERVER['HTTP_VIA'],可以区分为UA(代理)、设备、浏览器
-
市面上的常见设备与浏览器:
- 浏览器:谷歌、IE、火狐、欧朋、safair、blackberry
- 设备【此处过多不在这一一举例】:android、iso、ipad、ipod等
- 那么综合上述信息,我们的问题可以分为三个部分,判断是否是手机端、获取当前设备、获取当前浏览器
- 实现
-
* HTTP_X_WAP_PROFILE:
* 手机端的UA信息收集可以利用X-WAP-PROFILE,它里面包含屏幕的大小,屏幕显示字符个数,厂家、版本、浏览器型号等。
* 如果是移动设备,肯定会有‘HTTP_X_WAP_PROFILE’这个标识的,
* 所以我们可以利用PHP来判断是否存在$_SERVER['HTTP_X_WAP_PROFILE']来确认用户的访问设备类型
*
* HTTP_VIA:
* 列出从客户端到服务器端或者相反方向的响应经过了哪些代理服务器,
* 他们用什么协议发送的请求。当客户端请求到达第一个代理服务器时,
* 该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,
* 当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,
* 并把自己的相关信息加到后面。以此类推,当终端服务器收到最后一个代理服务器的请求时,检查 Via 头部。
* 就知道该请求所经过的路由。
<?php
class CheckClient
{
// UA:用户代理
private $userAgent;
// 设备
private $device = array('nokia',
'sony',
'ericsson',
'mot',
'samsung',
'htc',
'sgh',
'lg',
'sharp',
'sie-',
'philips',
'panasonic',
'alcatel',
'lenovo',
'iphone',
'ipod',
'blackberry',
'meizu',
'android',
'netfront',
'symbian',
'ucweb',
'windowsce',
'palm',
'operamini',
'operamobi',
'openwave',
'nexusone',
'cldc',
'midp',
'wap',
'mobile',
'ipad',
'kindle',
'silk/'
);
// 浏览器
private $browser = array(
'edge',
'firefox',
'chrome',
'opera',
'msie',
'safari',
'blackberry',
'trident'
);
private $deviceLength;
private $browserLength;
public function __construct()
{
$this->userAgent = $_SERVER['HTTP_USER_AGENT'];
var_dump($this->userAgent);
$this->userAgent = strtolower($this->userAgent);
$this->deviceLength = count($this->device);
$this->browserLength = count($this->browser);
}
/**
* 判断是否是手机端
*
* HTTP_X_WAP_PROFILE:
* 手机端的UA信息收集可以利用X-WAP-PROFILE,它里面包含屏幕的大小,屏幕显示字符个数,厂家、版本、浏览器型号等。
* 如果是移动设备,肯定会有‘HTTP_X_WAP_PROFILE’这个标识的,
* 所以我们可以利用PHP来判断是否存在$_SERVER['HTTP_X_WAP_PROFILE']来确认用户的访问设备类型
*
* HTTP_VIA:
* 列出从客户端到服务器端或者相反方向的响应经过了哪些代理服务器,
* 他们用什么协议发送的请求。当客户端请求到达第一个代理服务器时,
* 该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,
* 当下一个代理服务器 收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via头部,
* 并把自己的相关信息加到后面。以此类推,当终端服务器收到最后一个代理服务器的请求时,检查 Via 头部。
* 就知道该请求所经过的路由。
*
* @return bool
*/
public function is_mobile()
{
if (empty($this->userAgent)) {
$is_mobile = false;
} elseif ($this->findDevice()) {
$is_mobile = true;
} elseif (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
return true;
} elseif (isset($_SERVER['HTTP_VIA'])) {
return true;
} else {
$is_mobile = false;
}
return $is_mobile;
}
/**
* 查找当前设备
* @return mixed
*/
public function findDevice()
{
for ($uaSniff = 0; $uaSniff < $this->deviceLength; $uaSniff++) {
if (strstr($this->userAgent, $this->device[$uaSniff])) {
return $this->device[$uaSniff];
}
}
}
/**
* 查找当前浏览器
* @return mixed
*/
public function findBrowser()
{
for ($uaSniff = 0; $uaSniff < $this->browserLength; $uaSniff++) {
if (strstr($this->userAgent, $this->browser[$uaSniff])) {
return $this->browser[$uaSniff];
}
}
}
}
本篇文章就到这里了顺便附带一个知识点好了,为啥浏览器的User-agent这么长?
- 有兴趣的小伙伴可以去看【http://www.nowamagic.net/libr...】 这篇文章
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。