PHP開發(fā)APP接口需要注意下面問題:
專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)茫崖免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了數(shù)千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1.制定規(guī)范
開發(fā)前一定要定好一個規(guī)范,比如要定好數(shù)據(jù)返回的通用參數(shù)和格式。關(guān)于數(shù)據(jù)格式,用的比較多的有xml和json,我建議用json,因為json比xml的好處更多。
2.精簡的返回數(shù)據(jù)
接口數(shù)據(jù)因符合需要什么返回什么的原則,比如要查詢某個用戶的余額和注冊時間,網(wǎng)頁里面的做法可能是select * from user where
uid=1,但是接口一定要select balance,regtime from user where
uid=1。因為接口返回數(shù)據(jù)是要有開銷的,要流量的,能少返回數(shù)據(jù)就盡量少返回,這樣可以大大的提高性能。
3.數(shù)據(jù)類型要嚴(yán)格
要注意數(shù)據(jù)的類型,整數(shù)類型的數(shù)據(jù)一定要轉(zhuǎn)為int,因為app客戶端開發(fā)的java、object-c語言對數(shù)據(jù)類型比較嚴(yán)格,類型不對會照成app閃退。
4.要寫接口文檔
一定要寫好接口文檔,并按照模塊寫,而且還要書寫規(guī)范,最好的格式是:
接口請求地址;請求參數(shù)(包括參數(shù)名、類型、是否必填);測試參數(shù)舉例;返回參數(shù)(參數(shù)名,并注明每個參數(shù)的含義)。
這樣哪怕以后項目很大,以不會照成維護(hù)困難的問題。
5.保證代碼正確性
要驗證保證代碼正確無誤,而且生成環(huán)境中要屏蔽掉錯誤,避免頭部有額外的輸出,照成返回的json等數(shù)據(jù)解析失敗而導(dǎo)致app閃退等。
6.要優(yōu)化代碼的性能
app要求響應(yīng)迅速,這樣才能給用戶比較好的體驗感。所以移動接口端在處理業(yè)務(wù)邏輯的時候,要避免不要執(zhí)行太復(fù)雜的sql語句,或者含有大量的循環(huán),能做成緩存的盡量做緩存,比如將首頁的熱點(diǎn)模塊信息可以存到redis緩存中。在不考慮網(wǎng)速的情況下,比較理想的接口響應(yīng)時間應(yīng)該是200毫秒以內(nèi)。
7.不要隨意更改舊接口
app不像網(wǎng)頁,app一旦發(fā)布,有人使用之后,接口就不要亂修改了。以后升級也是,修改要在保證接口原有結(jié)構(gòu)之上進(jìn)行額外的擴(kuò)展,否則會導(dǎo)致調(diào)用舊版接口的app出現(xiàn)bug。
8. 注意接口的安全
安全高于一切,必須要保證接口的安全。電話號碼等敏感信息在傳輸?shù)倪^程中一定要加密,否則可能會被別人抓包到。拿取用戶信息的接口一定要驗證權(quán)限,以防止接口被惡意調(diào)用,泄密用戶信息,甚至篡改信息。
PHP與大多數(shù)面向?qū)ο缶幊陶Z言一樣,不支持多重繼承.也就是說每個類只能繼承一個父類.為了解決這個問題,PHP引入了接口,接口的思想是指定了一個實現(xiàn)了該接口的類必須實現(xiàn)的一系列方法.接口是一種特殊的抽象類,抽象類又是一種特殊的類,所以接口也是一種特殊的類,為什么說接口是一種特殊的抽象類呢?如果一個抽象類里面的所有的方法都是抽象方法,那么我們就換一種聲明方法使用“接口“;也就是說接口里面所有的方法必須都是聲明為抽象方法,另外接口里面不能聲明變量(但可聲明常量constant),而且接口里面所有的成員都是public權(quán)限的。所以子類在實現(xiàn)的時候也一定要使用public權(quán)限實限。
聲明一個類的時候我們使用的關(guān)鍵字是”class”,而接口一種特殊的類,使用的關(guān)鍵字是“interface”;
類的定義: class 類名{ … } ,接口的聲明:interface 接口名{ …}
代碼
代碼
?php
//定義一個接口使用interface關(guān)鍵字,“One”為接口名稱
interface One
{
//定義一個常量
const constant = 'constant value';
//定義了一個抽象方法”fun1”
public function fun1();
//定義了抽象方法”fun2”
public function fun2();
}
?
上例中定義了一個接口”one”,里面聲明了兩個抽象方法“fun1”和”fun2”,因為接口里面所有的方法都是抽象方法,所以在聲明抽象方法的時候就不用像抽象類那樣使用”abstract”這個關(guān)鍵字了,默認(rèn)的已經(jīng)加上這個關(guān)鍵字,另外在接口里邊的”public”這個訪問權(quán)限也可以去掉,因為默認(rèn)就是public的,因為接口里所有成員都要是公有的,所在對于接口里面的成員我們就不能使用“private”的和”protected”的權(quán)限了,都要用public或是默認(rèn)的。另外在接口里面我們也聲明了一個常量“constant“, 因為在接口里面不能用變量成員,所以我們要使用const這個關(guān)鍵字聲明。
因為接口是一種特殊的抽象類,里面所有的方法都是抽象方法,所以接口也不能產(chǎn)生實例對象; 它也做為一種規(guī)范,所有抽象方法需要子類去實現(xiàn)。
我們可以使用”extends”關(guān)鍵字讓一個接口去繼承另一個接口:
?php
//使用”extends”繼承另外一個接口
interface Two extends One
{
function fun3();
function fun4();
}
?
而我們定義一接口的子類去實現(xiàn)接口中全部抽象方法使用的關(guān)鍵字是”implements”,而不是我們前面所說的”extends”;
代碼
?php
//使用“implements”這個關(guān)鍵字去實現(xiàn)接口中的抽象方法 接口和類之間
class Three implements One
{
function fun1()
{
…
}
function fun2()
{
…
}
}
//實現(xiàn)了全部方法,我們?nèi)タ梢允褂米宇惾嵗瘜ο罅?/p>
$three=new Three();
?
我們也可以使用抽象類,去實現(xiàn)接口中的部分抽象方法,但要想實例化對象,這個抽象類還要有子類把它所有的抽象方法都實現(xiàn)才行;
在前面我們說過,PHP是單繼承的,一個類只能有一父類,但是一個類可以實現(xiàn)多個接口,就相當(dāng)于一個類要遵守多個規(guī)范,就像我們不僅要遵守國家的法律,如果是在學(xué)校的話,還要遵守學(xué)校的校規(guī)一樣;
?php
//使用implements實現(xiàn)多個接口
class Four implemtns 接口一, 接口二, ….
{
//必須把所有接口中的方法都要實現(xiàn)才可以實例化對象。
}
?
PHP中不僅一個類可以實現(xiàn)多個接口,也可以在繼承一個類的同時實現(xiàn)多個接口, 一定要先繼承類再去實現(xiàn)接口;
?php
//使用extends繼承一個類,使用implements實現(xiàn)多個接口
class Four extends 類名一 implemtns 接口一, 接口二, ….
{
//所有接口中的方法都要實現(xiàn)才可以實例化對象
………
}
?
進(jìn)入php源程序目錄中的ext目錄中,這里存放著各個擴(kuò)展模塊的源代碼,選擇你需要的模塊,比如curl模塊:cd curl
執(zhí)行phpize生成編譯文件,phpize在PHP安裝目錄的bin目錄下
/usr/local/php5/bin/phpize
運(yùn)行時,可能會報錯:Cannot find autoconf. Please check your autoconf installation and
the $PHP_AUTOCONF
environment variable is set correctly and then rerun this
script.,需要安裝autoconf:
yum install autoconf(RedHat或者CentOS)、apt-get install
autoconf(Ubuntu Linux)
/usr/local/php5/bin/php -v
執(zhí)行這個命令時,php會去檢查配置文件是否正確,如果有配置錯誤,
這里會報錯,可以根據(jù)錯誤信息去排查!
cms提供直接輸出、PHP代碼體兩種方便開發(fā)者使用的數(shù)據(jù)輸出接口。
1、直接輸出
本類型是將后臺錄入的數(shù)據(jù)格式原樣輸出到客戶端
返回格式為:
array(3) { ["code"]= int(1) ["msg"]= string(2) "ok" ["data"]= string(7) "test123" }
2、JSON數(shù)組
本類型數(shù)據(jù)內(nèi)容必須是一個json格式的數(shù)組字符串
返回格式為:
array(3) { ["code"]= int(1) ["msg"]= string(2) "ok" ["data"]= array(3) { [0]= string(1) "1" [1]= string(1) "2" [2]= string(1) "3" } }
3、php執(zhí)行代碼
4、模板查詢標(biāo)簽
本類型需要有CMS模板標(biāo)簽的使用經(jīng)驗,直接寫標(biāo)簽代碼返回結(jié)果
例如調(diào)用news模塊全部數(shù)據(jù):
{module module=news} 或者 {list action=module module=news}
模板標(biāo)簽只能寫一段,不能寫多段
通過以上的list查詢方法可調(diào)用循環(huán)標(biāo)簽的全部數(shù)據(jù),當(dāng)然你可以對結(jié)果進(jìn)行格式化處理,使用回調(diào)方法。
5、自定義模板標(biāo)簽
本類型需要有CMS模板標(biāo)簽的使用經(jīng)驗,直接寫標(biāo)簽代碼返回結(jié)果,區(qū)別于(4),本類型可以直接在標(biāo)簽里面寫賦值方法和格式化顯示,不需要寫回調(diào)方法
這里循環(huán)出news模塊的全部數(shù)據(jù),只顯示id,title,再把thumb轉(zhuǎn)換為url地址。
也可以這樣寫,原理是將輸出變量賦值給$api數(shù)組:
{module module=news} {php $api[$key]['id']=$t['id'];} {php $api[$key]['title']=$t['title'];} {php $api[$key]['thumb']=dr_thumb($t['thumb'], 200,200);} {/module}
以上語法格式為:
6、自定義PHP代碼
本類型需要有PHP的開發(fā)使用經(jīng)驗,直接將php業(yè)務(wù)代碼寫進(jìn)去
$api變量為直接返回,例如:
$api = '我的自定義返回變量值';
返回截圖如下:
也可以自定義強(qiáng)制返回
$api = '我的自定義返回變量值'; PhpcmfService::C()-_json(1, '我的返回腳本成功了', $api); // 成功寫法 PhpcmfService::C()-_json(0, '我的返回腳本失敗了'); // 失敗寫法