|
关于接口的实现问题,我尽量通俗的解释下:假设你设定了某个接口InterfaceI1;里面有个需要实现的方法,如intfunc1();那么,进一步的,你写了一个类C1,去实现这个接口I1,此时就有两种实现的方法:方法1:显示实现,publicintfunc1(){.....}方法2:隐式实现,privateintfunc1(){.....}(或protectedintfunc1(){.....})发现区别了吧,如果是显示的,那么进一步,你可以通过C1.func1();来执行这个函数,即:C1myC1=newC1();myC1.func1();但是隐式就不能这样,因为private(或protected)修饰词不允许用户直接访问,但你仍然可以通过接口访问这个函数,即:I1myI1=newC1();//注意,此时myI1是接口,并通过C1实现了这个接口.myI1.func1();//通过接口访问了某个隐式实现的函数.interfaceI1{voidfunc1();}显示实现:publicclassC1:I1{voidI1.func1(){//显示实现即通过接口.函数来实现某个函数}}隐式实现:publicclassC1:I1{voidfunc1(){//隐式实现即不写出接口的名称,只要函数名称与接口定义相同即可}}接口的实现分为:隐式实现和显式实现。如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现。显示实现是通过使用接口的完全限定名来实现接口成员的。在上一篇文章中《使用DbUtils实现增删改查》,发现执行runner.query()这行代码时,需要自己去处理查询到的结果集,比较麻烦。这行代码的原型是:publicObjectquery(Connectionconn,Stringsql,ResultSetHandlerTrsh,Object.params)其中ResultSet在上一篇文章中《使用DbUtils实现增删改查》,发现执行runner.query()这行代码时,需要自己去处理查询到的结果集,比较麻烦。这行代码的原型是:publicObjectquery(Connectionconn,Stringsql,ResultSetHandlerrsh,Object.params)其中ResultSetHandler是一个接口,实际上,万能的Apache已经为我们提供了众多好用的实现类,现在举例如下:publicclassRSHanlderDemo{//ScalarHandler:获取结果集中第一行数据指定列的值,常用来进行单值查询@Testpublicvoidtes9()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Longcount=(Long)runner.query(selectcount(*)fromaccount,newScalarHandler());System.out.println(count);}//KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。@Testpublicvoidtes8()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Map>map=runner.query(select*fromaccountwheremoney>?,newKeyedHandler(id),500);System.out.println(map);}//ColumnListHandler:将结果集中某一列的数据存放到List中。@Testpublicvoidtes7()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Listlist=runner.query(select*fromaccountwheremoney>?,newColumnListHandler(3),500);System.out.println(list);}//MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List@Testpublicvoidtes6()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());List>list=runner.query(select*fromaccountwheremoney>?,newMapListHandler(),500);System.out.println(list);}//MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。@Testpublicvoidtes5()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Mapmap=runner.query(select*fromaccountwheremoney>?,newMapHandler(),500);System.out.println(map);}//BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。@Testpublicvoidtes4()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Listlist=runner.query(select*fromaccountwheremoney>?,newBeanListHandler(Account.class),500);System.out.println(list);}//BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。@Testpublicvoidtes3()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Accountacc=runner.query(select*fromaccountwheremoney>?,newBeanHandler(Account.class),500);System.out.println(acc);}//ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。@Testpublicvoidtes2()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Listlist=runner.query(select*fromaccountwheremoney>?,newArrayListHandler(),500);System.out.println(list);}//ArrayHandler:把结果集中的第一行数据转成对象数组。@Testpublicvoidtest1()throwsSQLException{QueryRunnerrunner=newQueryRunner(newComboPooledDataSource());Object[]objs=runner.query(select*fromaccountwheremoney>?,newArrayHandler(),500);System.out.println(objs);}}测试时,可以加断点调试,再执行DebugasJUnitTest。总结如下:①ArrayHandler:把结果集中的第一行数据转成对象数组。②ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。③BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。④BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。⑤MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。⑥MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List⑦ColumnListHandler:将结果集中某一列的数据存放到List中。⑧KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。⑨ScalarHandler:获取结果集中第一行数据指定列的值,常用来进行单值查询。这篇文章主要介绍了CodeIgniter开发实现支付宝接口调用的方法,结合实例形式分析了CodeIgniter开发支付宝接口的操作步骤与相关实现技巧,需要的朋友可以参考下本文实例讲述了CodeIgniter开发实现支付宝接口调用的方法。分享给大家供大家参考,具体如下:准备:1、alipay官方下载最新接口类库2、解压后,将目录"即时到账交易接口-create_direct_pay_by_userdemocreate_direct_pay_by_user-PHP-UTF-8lib"复制到applicationthird_party目录下,并改名lib为alipay3、同样复制cacert.pem文件到"applicationthird_partyalipay"目录下,这个不是必须的,在走ssl通道时用到的证书代码实例:以下只列出controller部分代码,view与model根据自己实际需要去编写<phpif(!defined('BASEPATH'))exit('Nodirectscriptaccessallowed');/***alipy支付接口*@authoronwulc@163.com**/classAlipayextendsCI_Controller{private$alipay_config;function__construct(){parent:__construct();$this->_init_config();$this->load->helper('url');}functionindex(){$this->load->view('alipay');//装载支付视图页面,post到do_alipay}functiondo_alipay(){require_once(APPPATH.'third_party/alipay/alipay_submit.class.php');//构造要请求的参数数组,无需改动$parameter=array("service"=>"create_direct_pay_by_user""partner"=>trim($this->alipay_config['partner']),"payment_type"=>'1'"notify_url"=>site_url('alipay/do_notify'),"return_url"=>site_url('alipay/do_return'),"seller_email"=>trim($this->alipay_config['seller_emaill']),//支付宝帐户,"out_trade_no"=>$this->input->post('WIDout_trade_no'),//商户订单号"subject"=>$this->input->post('WIDsubject'),//订单名称"total_fee"=>$this->input->post('WIDtotal_fee'),//必填,付款金额"body"=>$this->input->post('WIDbody'),//必填,订单描述"show_url"=>$this->input->post('WIDshow_url'),//商品展示地址"anti_phishing_key"=>''//防钓鱼时间戳"exter_invoke_ip"=>''//客户端的IP地址"_input_charset"=>trim(strtolower($this->alipay_config['input_charset'])));//建立请求$alipaySubmit=newAlipaySubmit($this->alipay_config);$html_text=$alipaySubmit->buildRequestForm($parameter,"get""确认");echo$html_text;}functiondo_notify(){require_once(APPPATH.'third_party/alipay/alipay_notify.class.php');}functiondo_return(){require_once(APPPATH.'third_party/alipay/alipay_notify.class.php');$alipayNotify=newAlipayNotify($this->alipay_config);$verify_result=$alipayNotify->verifyReturn();//商户订单号$out_trade_no=$_GET['out_trade_no'];//支付宝交易号$trade_no=$_GET['trade_no'];//交易状态$trade_status=$_GET['trade_status'];if($_GET['trade_status']=='TRADE_FINISHED'||$_GET['trade_status']=='TRADE_SUCCESS'){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序echo'支付成功,交易处理环节'}else{echo"trade_status="$_GET['trade_status'];}echo"验证成功<br/>"}/***初始化支付宝配置,详细参数请根据自己实际接口修改*/privatefunction_init_config(){//支付宝帐户$alipay_config['seller_emaill']=''//合作身份者id,以2088开头的16位纯数字$alipay_config['partner']='2088999999999999'//安全检验码,以数字和字母组成的32位字符$alipay_config['key']='vhyjvdht3ayxbtx692vlkbwilhXXXXXX'//签名方式不需修改$alipay_config['sign_type']=strtoupper('MD5');//字符编码格式目前支持gbk或utf-8$alipay_config['input_charset']=strtolower('utf-8');//ca证书路径地址,用于curl中ssl校验//请保证cacert.pem文件在当前文件夹目录中$alipay_config['cacert']=APPPATH.'third_party/alipay/cacert.pem'//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http$alipay_config['transport']='http'$this->alipay_config=$alipay_config;}}
|