百度lbs云获取附近的商家位置例子

 更新时间:2016年11月25日 16:17  点击:1573
lbs功能现在被用到点击多的地方了,其实它们这个就是通过百度的地图接口来查询了,正同我们一起来看一个简单的例子。


按地区搜索:
http://api.map.baidu.com/geosearch/v3/local?region=%E5%8E%A6%E9%97%A8&ak=pWiNP7mGeptewlpldEdv3Ur3&geotable_id=*****
按位置中心点搜索(距离中心位置1800米):
http://api.map.baidu.com/geosearch/v3/nearby?ak=pWiNP7mGeptewlpldEdv3Ur3&geotable_id=***&location=118.145572,24.49264&radius=1800

程序代码如下

首先要把数据录入到百度云数据库
用接口提交位置信息,坐标经纬度到百度lbs云数据库。
百度提供可视化的LBS云数据库管理:
http://lbsyun.baidu.com/datamanager/datamanage
已下是我写的一个提交数据接口:
这里是提交或更新一个lbs数据。
function ptolbs($data,$lbsid){ 
if($lbsid<=0){
    $purl = 'http://api.map.baidu.com/geodata/v3/poi/create';
}else{
    $data['id']=$lbsid;
    $purl = "http://api.map.baidu.com/geodata/v3/poi/update";
}
    
    $data['ak']="pWiNP7mGeptewlpldEdv3Ur3";
    $data['geotable_id']="***";//你的数据库ID   
    $data['coord_type']="3";
    $re = curlpost($purl,$data);
    $re = json_decode($re,true);
    if($re["status"]==0){
        $lbsid =$re['id'];
    }else{
        $lbsid = -1;
    }
    return  $lbsid;
}
 
 
function curlpost($c_url,$data)
{
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $c_url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
   // curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
       echo 'Errno'.curl_error($curl);//捕抓异常
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}

原理很简单就是通过我们申请的key 带在curl中post给百度api,然后百度返回查询对应的坐标与数据给我们。

多线程是指同时处理几个数据了如我们php curl是php中唯一能实现一个简单的多线程的功能了,下面来一个利用php curl实现多线程抓取网页并同时下载图片的例子。

php语言本身不支持多线程,所以开发爬虫程序效率并不高,借助Curl Multi 它可以实现并发多线程的访问多个url地址。用 Curl Multi 多线程下载文件代码:

代码1:将获得的代码直接写入某个文件

<?php
$urls =array( 
 'http://www.111cn.net/', 
 'http://www.baidu.com/', 
);// 设置要抓取的页面URL 
    
$save_to='test.txt';  // 把抓取的代码写入该文件  
  
$st =fopen($save_to,"a"); 
$mh = curl_multi_init();  
  
foreach ($urls as $i =>$url) { 
  $conn[$i] = curl_init($url); 
  curl_setopt($conn[$i], CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); 
  curl_setopt($conn[$i], CURLOPT_HEADER ,0); 
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); 
  curl_setopt($conn[$i], CURLOPT_FILE,$st);// 设置将爬取的代码写入文件 
  curl_multi_add_handle ($mh,$conn[$i]); 
}// 初始化 
    
do { 
  curl_multi_exec($mh,$active); 
}while ($active); // 执行 
    
foreach ($urls as $i =>$url) { 
  curl_multi_remove_handle($mh,$conn[$i]); 
  curl_close($conn[$i]); 
}// 结束清理 
    
curl_multi_close($mh); 
fclose($st);
?>
代码2:将获得的代码先放入变量,再写入某个文件

<?php
$urls =array( 
 'http://m.111cn.net/', 
 'http://www.111cn.net/', 
 'http://www.163.com/'
); 
  
$save_to='/test.txt';  // 把抓取的代码写入该文件 
$st =fopen($save_to,"a"); 
  
$mh = curl_multi_init(); 
foreach ($urls as $i =>$url) { 
  $conn[$i] = curl_init($url); 
  curl_setopt($conn[$i], CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); 
  curl_setopt($conn[$i], CURLOPT_HEADER ,0); 
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); 
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 设置不将爬取代码写到浏览器,而是转化为字符串 
  curl_multi_add_handle ($mh,$conn[$i]); 

  
do { 
  curl_multi_exec($mh,$active); 
}while ($active); 
    
foreach ($urls as $i =>$url) { 
  $data = curl_multi_getcontent($conn[$i]);// 获得爬取的代码字符串 
  fwrite($st,$data); // 将字符串写入文件。当然,也可以不写入文件,比如存入数据库 
}// 获得数据变量,并写入文件 
  
foreach ($urls as $i =>$url) { 
  curl_multi_remove_handle($mh,$conn[$i]); 
  curl_close($conn[$i]); 

  
curl_multi_close($mh); 
fclose($st);
?> 

curl抓取网页中文乱码的解决方法

function ppost($url,$data,$ref){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_REFERER, $ref);
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_COOKIEFILE,$GLOBALS ['cookie_file']); // 读取上面所储存的Cookie信息
curl_setopt($curl, CURLOPT_COOKIEJAR, $GLOBALS['cookie_file']); // 存放Cookie信息的文件名称

curl_setopt($curl, CURLOPT_HTTPHEADER,array('Accept-Encoding: gzip, deflate'));
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');这个是解释gzip内容.................
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);
}
curl_close($curl); // 关键CURL会话
return $tmpInfo; // 返回数据
}

CORS实现POST方式跨域请求数据以前利用iframe时有用到过了,这里再整一个例子供各位参考,此例子是用于js的ajax中哦。


CORS全名Cross-Origin Resource Sharing,顾名思义:跨域分享资源,这是W3C制定的跨站资源分享标准。

目前包括IE10+、chrome、safari、FF都提供了XMLHttpRequest对象对该标准的支持,在更老的IE8中则提供了xDomainRequest对象,部分实现了该标准;

下面是创建request对象的代码:

var url = "http://www.111cn.net /1.php";

if (XMLHttpRequest) {
    var req = new XMLHttpRequest();
    // 利用withCredentials属性来判断是否支持跨域请求
    if (!("withCredentials" in req)) { // w3c先行
        if (window.XDomainRequest) {
            req = new XDomainRequest();
        }
    }
    req.open('POST', url, true);
    req.onload = function (data) {
        alert(this.responseText);
    };
    req.send();
}

注意xDomainRequest对象只支持http和https协议

在利用XMLHttpRequest对象发POST请求前会发一个options嗅探来确定是否有跨域请求的权限;同时在header头上带上Origin信息来指示来源网站信息,服务器响应时需要带上Access-Control-Allow-Origin头的值是否和Origin信息相匹配。

header("Access-Control-Allow-Origin: http://localhost"); // *为全部域名

CORS的缺点是你必须能控制服务器端的权限,允许你跨域访问

设置CORS实现跨域请求

一、使用php代码实现

#
# CORS config for php
# Code by anrip[mail@anrip.com]
#
 
function make_cors($origin = '*') {
 
    $request_method = $_SERVER['REQUEST_METHOD'];
 
    if ($request_method === 'OPTIONS') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
        header('Access-Control-Max-Age:1728000');
        header('Content-Type:text/plain charset=UTF-8');
        header('Content-Length: 0',true);
 
        header('status: 204');
        header('HTTP/1.0 204 No Content');
 
    }
 
    if ($request_method === 'POST') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
    }
 
    if ($request_method === 'GET') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
    }
 
}


二、使用nginx配置实现


# CORS config for nginx
# Code by anrip[mail@anrip.com]
#
 
location / {
 
    set $origin '*';
 
    if ($request_method = 'OPTIONS') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
 
        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
 
        return 204;
 
    }
 
    if ($request_method = 'POST') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    }
 
    if ($request_method = 'GET') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    }
 
}

微信红包的原因就是通过指定的标识获得商户的信息然后进行发红包了,这个功能不简单并且要申请与验证和操作都非常的麻烦了,下面来看看微信红包api接口开发例子。

人工手动发放

商户在已经获知要发送的用户的openid情况下,可以将openid编辑成txt文件,直接登录微信支付商户平台,同样在“资金管理-现金管理”中充值后,创建要发放的红包,并填写金额等相关信息,再根据指引操作即可。

系统自动发放

商户需先发送邮件至wxhongbao@tencent.com获取流程指引,再登录商户平台(pay.weixin.qq.com ),在“资金管理-现金管理”中充值;然后即可自行根据开发文档进行开发,并发放现金红包,我们重点讲系统发布。

首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书。在管理后台的“账户信息”里找到“安全设置”就可以下载了证书了。

微信平台红包开启教程

接着就是向帐号中充值,因为发放现金红包将扣除商户的可用余额,所以需要预先充值,确保可用余额充足。进入“资金管理”菜单找到“现金管理”,在此进行充值,保证帐号有余额可以进行红包发放。

微信平台红包开启教程

 

 

根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析

红包接口调用请求代码,所有请求参数为必填参数与文档对应:
class Wxapi {
    private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号
    private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token
    private $app_mchid = 'XXXXXXXX';//商户号id
    function __construct(){
    //do sth here....
    }
    /**
     * 微信支付
     * @param string $openid 用户openid
     */
    public function pay($re_openid)
    {
        include_once('WxHongBaoHelper.php');
        $commonUtil = new CommonUtil();
        $wxHongBaoHelper = new WxHongBaoHelper();
        $wxHongBaoHelper->setParameter("nonce_str", $this->great_rand());//随机字符串,丌长于 32 位
        $wxHongBaoHelper->setParameter("mch_billno", $this->app_mchid.date('YmdHis').rand(1000, 9999));//订单号
        $wxHongBaoHelper->setParameter("mch_id", $this->app_mchid);//商户号
        $wxHongBaoHelper->setParameter("wxappid", $this->app_id);
        $wxHongBaoHelper->setParameter("nick_name", '红包');//提供方名称
        $wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
        $wxHongBaoHelper->setParameter("re_openid", $re_openid);//相对于医脉互通的openid
        $wxHongBaoHelper->setParameter("total_amount", 100);//付款金额,单位分
        $wxHongBaoHelper->setParameter("min_value", 100);//最小红包金额,单位分
        $wxHongBaoHelper->setParameter("max_value", 100);//最大红包金额,单位分
        $wxHongBaoHelper->setParameter("total_num", 1);//红包?Х抛苋耸?br />         $wxHongBaoHelper->setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');//红包祝福诧
        $wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
        $wxHongBaoHelper->setParameter("act_name", '红包活动');//活劢名称
        $wxHongBaoHelper->setParameter("remark", '快来抢!');//备注信息
        $postXml = $wxHongBaoHelper->create_hongbao_xml();
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
        $responseXml = $wxHongBaoHelper->curl_post_ssl($url, $postXml);
        //用作结果调试输出
        //echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
    $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
    return $responseObj->return_code;
    }
获取随机字符串方法:

/**
 * 生成随机数
 */    
public function great_rand(){
    $str = '1234567890abcdefghijklmnopqrstuvwxyz';
    for($i=0;$i<30;$i++){
        $j=rand(0,35);
        $t1 .= $str[$j];
    }
    return $t1;   
}
签名算法:


/**
例如:
appid:    wxd111665abv58f4f
mch_id:    10000100
device_info:  1000
Body:    test
nonce_str:  ibuaiVcKdpRxkhJA
第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接支付密钥:
stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
9CF3B7"
*/
protected function get_sign(){
    define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");
    try {
        if (null == PARTNERKEY || "" == PARTNERKEY ) {
           throw new SDKRuntimeException("密钥不能为空!" . "<br>");
        }
        if($this->check_sign_parameters() == false) {   //检查生成签名参数
           throw new SDKRuntimeException("生成签名参数缺失!" . "<br>");
        }
        $commonUtil = new CommonUtil();
        ksort($this->parameters);
        $unSignParaString = $commonUtil->formatQueryParaMap($this->parameters, false);
        $md5SignUtil = new MD5SignUtil();
        return $md5SignUtil->sign($unSignParaString,$commonUtil->trimString(PARTNERKEY));
    }catch (SDKRuntimeException $e)
    {
        die($e->errorMessage());
    }
 
}
CURL请求以及发送证书:

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
{
    $ch = curl_init();
    //超时时间
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    //这里设置代理,如果有的话
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);    
    //cert 与 key 分别属于两个.pem文件
    //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
    curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'rootca.pem');
    if( count($aHeader) >= 1 ){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
    $data = curl_exec($ch);
    if($data){
        curl_close($ch);
        return $data;
    }
    else {
        $error = curl_errno($ch);
        //echo "call faild, errorCode:$error\n";
        curl_close($ch);
        return false;
    }
}

入口文件:


@require "pay.php";
//获取用户信息
$get = $_GET['param'];
$code = $_GET['code'];
//判断code是否存在
if($get=='access_token' && !empty($code)){
    $param['param'] = 'access_token';
    $param['code'] = $code;
    $packet = new Packet();
    //获取用户openid信息
    $userinfo = $packet->_route('userinfo',$param);
    if(empty($userinfo['openid'])){
        exit("NOAUTH");
    }
    //调取支付方法
    $packet->_route('wxpacket',array('openid'=>$userinfo['openid']));
}else{
    $packet->_route('userinfo');
}

开发所需文档:

1)官方红包高级接口文档

2)官方公众平台获取用户基本信息接口文档

3)商户平台开发文档

对于PHP多态大在学时后面的教程没人教自己也没有看懂,在实际应用中PHP多态用到也是非常的少了,下面整理了一篇关于PHP多态的例子。


多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。


我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求,通俗来讲多态就是指同一东西的多种表现形式;

看如下代码:

 

abstract class A{    
    public abstract function abc();
}
 
class AB extends A{
    public function abc(){
        echo 'ab';
    }
}
 
class AC extends A{
    public function abc(){
        echo 'ac';
    }
}
 
class T{
    public function abc(){
        echo 't'
    }
}
 
class Client{
    public static function call(A $obj){
        $obj-&gt;abc();
    }
}
 
Client::call(new AB());//ab
Client::call(new AC());//ac
Client::call(new T()); //error  Client类的方法应该为   public static function call($obj){      $obj-&gt;climb();   }
 

如我们创建一个doing()方法,如果是学生则打印上课,如是公司职员则打印上班。

普通做法

使用if判断

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    public function cla(){
            echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{                              
        public function Wor(){
            echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof student){ 
            $obj->cla();
        }elseif($obj instanceof office){
            $obj->wor();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

以上结果输出:

学生正在上课

职员正在上班

这种普通方法有个缺点,就是对象如果很多,那么if..else..很长,不灵活。

 

多态性做法
定义一个公共抽象方法,所有子类继承它。

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义一个公共类
class pub{
    protected function working(){
        echo "本方法需要在子类中重载!";
    }
}
 
// 定义学生类,继承公共类pub
class student extends pub{
    public function working(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类,继承公共类pub
class office extends pub{
        public function working(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof pub){ 
            $obj->working();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

这就是多态的特性,灵活重用。


其它做法

从多态性的实现方式来看,无非就规范了每个类都要重载父类的一个方法,从而达到统一效果。而我们在定义类的时候,自行加上统一的方法也可行。因此以上例子也可以这么实现:
/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    // 定义统一的方法pub
    public function pub(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{
    // 定义统一的方法pub
        public function pub(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
    if($obj){
        // 调用类的统一方法
            $obj->pub();
    }else{
        echo '没有这个对象';  
    }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

当然,以上的例子不能说明多态性就能使用这样的方式搞定,毕竟多态性在复杂的程序设计中,它能有效的达到灵活重用的特性。

多态性也可以理解为一种程序设计方式,而程序设计最终目的无非就是:灵活,多态,重用,高效。

[!--infotagslink--]

相关文章

  • PHP成员变量获取对比(类成员变量)

    下面本文章来给大家介绍在php中成员变量的一些对比了,文章举了四个例子在这例子中分别对不同成员变量进行测试与获取操作,下面一起来看看。 有如下4个代码示例,你认...2016-11-25
  • 百度网盟和google网盟推广那种效果好

    专做了百度和google的网盟推广以作推广效果的评估比较。百度的周期为6天,google为4天。   从百度的统计数据可以看出这六天的点击次数总共为464,平均点击花费了0.30元...2017-07-06
  • php 获取用户IP与IE信息程序

    php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
  • php获取一个文件夹的mtime的程序

    php获取一个文件夹的mtime的程序了,这个就是时间问题了,对于这个问题我们来看小编整理的几个例子,具体的操作例子如下所示。 php很容易获取到一个文件夹的mtime,可以...2016-11-25
  • 如何获取网站icon有哪些可行的方法

    获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。...2020-06-30
  • jquery如何获取元素的滚动条高度等实现代码

    主要功能:获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 :$(window).width(); 获取页面的文档高度 $(document).height(); 获取页面的文档宽度 :$(document).width();...2015-10-21
  • jquery获取div距离窗口和父级dv的距离示例

    jquery中jquery.offset().top / left用于获取div距离窗口的距离,jquery.position().top / left 用于获取距离父级div的距离(必须是绝对定位的div)。 (1)先介绍jquery.offset().top / left css: 复制代码 代码如下: *{ mar...2013-10-13
  • Jquery 获取指定标签的对象及属性的设置与移除

    1、先讲讲JQuery的概念,JQuery首先是由一个 America 的叫什么 John Resig的人创建的,后来又很多的JS高手也加入了这个团队。其实 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用简单的一些代...2014-05-31
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • jquery获取tagName再进行判断

    如果是为了取到tagName后再进行判断,那直接用下面的代码会更方便: $(element).is('input') 如果是要取到标签用作到别的地方,可以使用一下代码: $(element)[0].tagName 或: $(element).get(0).tagName...2014-05-31
  • DOM XPATH获取img src值的query

    复制代码 代码如下:$nodes = @$xpath->query("//*[@id='main_pr']/img/@src");$prurl = $nodes->item(0)->nodeValue;...2013-10-04
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示:<script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script><script language="javascript" type="text/javascript" src="js/...2015-10-30
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • 百度联盟封号了解封申请攻略

    百度联盟封号对于许多的站长来说肯定是会影响到心情的,那么既然是百度联盟封号了我们就肯定有一些原因的,虽然不是你自己搞的或一些其它因素都有可能,我们下面整理一下百...2016-10-10
  • php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序。这是中国人大多数使用的排序方法。那么在php程序中该如何操作呢?下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的大多数是有问题的...2015-10-23
  • 使用C#获取系统特殊文件夹路径的解决方法

    本篇文章是对使用C#获取系统特殊文件夹路径的解决方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标

    本文给大家介绍javascript实现高德地图和百度地图提取行政区边界经纬度坐标的相关知识,本文实用性非常高,代码简单易懂,需要的朋友参考下吧...2016-01-24
  • php如何获取文件的扩展名

    网上也有很多类似的方法,不过都存在这样那样的不严谨的问题,本文就不一一分析了,这里只给出最正确的利用php 获取文件扩展名(文件后缀名)的方法。 function get_extension($filename){ return pathinfo($filename,PATHIN...2015-10-30
  • 基于JavaScript获取鼠标位置的各种方法

    这篇文章主要介绍了基于JavaScript获取鼠标位置的各种方法 ,需要的朋友可以参考下...2015-12-18