這是一篇以 iOS 開發人員的視角寫給廣大iOS 程序猿的 PHP 入門指南.在這篇文章里我努力去發掘 objectiv-c 與 php 之間的共性,來幫助有一定 iOS 開發經驗的攻城獅來快速上手一門后台開發語言.后台開發語言,就是以"數據接口"的形式出現在我們的開發文檔的那個東西!掌握PHP,無論對自己目前的iOS開發工作還是以后個人職場生涯的長久發展,都會大有裨益!最重要的是,PHP本身不是一個玩具語言,而是目前相當一部分公司仍然在用的后台開發語言,甚至包括你目前的公司;這篇文章,也不是一個簡單的基礎手冊,而是以一種更適合 iOS 開發人員理解的方式來系統講解 PHP 中最核心最重要最常用的概念和功能.閱讀並有效實踐本文,將有助於你擁有獨立編寫后台數據接口的能力.
必要的准備與說明
首先,你需要下載最新版 XAMPP軟件,以在本地搭建一個 php 服務器.下載地址: https://www.apachefriends.org/download.html.
下載完成后,雙擊安裝.安裝成功后,選擇 Mange Servers-->Start All啟動本地服務器.啟動成功后,在瀏覽器中輸入 http://localhost,就可以看到一個默認的PHP頁面.
你的php服務器文件默認放在: 應用程序-->XAMPP-->htdocs 目錄下.
然后你還需要下載一款PHP編輯器,此時我使用Github的Atom編輯器.個人感覺界面很舒適,代碼高亮看着也很舒服,你可以到這里下載: https://atom.io.下載完成后,點擊安裝即可.
最后要說明的是:PHP版本很多,下面的講解支持目前最常用的 php 5.3.0 及其以上版本.
Hello World!
下面編寫最簡單的 Hello World 程序,請在以下步驟執行.
1.在 應用程序-->XAMPP-->htdocs 目錄下新建目錄 find_php.
沒有特別的意思,純碎是為了演示方便,同時不干擾默認存在的php文件.
2.打開Atom編輯器,使用 cmd+N
新建文件,並輸入以下代碼,並 cmd+S
保存到 find_php目錄,文件命名為 index.php.
<?php
echo 'Hello World';
?>
如果PHP無法如中一樣高亮顯示,可能就需要點擊文件右下角,以手動指定當前問文件的語法高亮方式.
3.在瀏覽器地址欄輸入: http://localhost/find_php/index.php,即可看到用PHP寫的Hello World.
AppDelegate 入口文件
iOS應用通常是以 AppDelegate 文件作為編碼的起始(准確說的是 main.m,在此不細究).在PHP中,你可以使用一個 index.php 文件作為你的 php 程序的唯一入口.你的所有的php頁面間的訪問與跳轉,都將是由此處開始.下面的代碼可以先先復制到你的 index.php種,它實現了一個基本的頁面訪問與控制的框架:
<?php
$controller = '';
$model = array();
if (isset($_GET['viewController'])) {
$controller = $_GET['viewController'];
}
if (isset($_GET['model'])) {
$model = $_GET['model'];
}
echo '控制器:'.$controller.'<br />';
echo '數據模型:<br />';
foreach ($model as $key => $value) {
echo $key.':'.$value.'<br />';
}
?>
然后在瀏覽器地址欄,輸入: http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
頁面輸入:
控制器:HomeViewController
數據模型:
id:42
name:iOS122
age:25
viewController=
后面跟的是你你的表示你的視圖控制器, model
是一個字典,用於存儲數據模型,支持輸入多個鍵值對.id
,name
,age
等都是自定義的鍵,用於表示你想要傳給新頁面的數據,如果沒有可以不寫.
注意: 此處暫僅考慮簡單的GET請求,至於其他變體可在熟悉PHP語法后,自行書寫.學習新語言的初期,努力尋找新東西與已經掌握的東西的共通之處,總是可以事半功倍!
MVC 設計模式
我們仍然從常用的MVC模式來開始更進一步的討論.M,即Model數據模型,對應於我們在地址欄輸入的model;V,即視圖View,更直接地說是顯示數據,為了簡化討論,我們此處僅對移動端開發常用的JSON格式數據的顯示作一實現;C,即Controller控制器,也就是我們常說的視圖控制器,下面會具體討論如何在PHP中定義視圖控制器.
注意: 移動端數據接口只是PHP的應用場景之一.其實你日常接觸的絕對部分網站都是由 PHP 驅動的,要想寫出布局優美的網站,你需要學習HTML和JS相關的知識.如果有興趣,建議去這個網站: http://www.w3school.com.cn
改進后的 index.php
<?php // index.php
/* 實現類文件的自動加載 */
function __autoload($className) {
if (file_exists($className . '.php')) {
require_once $className . '.php';
return true;
}
return false;
}
// --------------------------------
/* 獲取用戶想要訪問的頁面的相關信息. */
$controllerName = '';
$model = array();
if (isset($_GET['viewController'])) {
$controllerName = $_GET['viewController'];
}
if (isset($_GET['model'])) {
$model = $_GET['model'];
}
/* 跳轉到指定頁面. */
if ('' !== $controllerName) {
/* 我們約定每個控制器都至少有一個$model屬性和 show方法 */
$controller = new $controllerName();
$controller->model = $model;
$controller->show();
}
?>
這個方法可以實現根據用戶輸入自動跳轉至對應的界面.你直接把代碼復制到index.php中即可,因為它暫時不再需要做變更了.一些說明的技術點是:
- 實現了 魔術方法 __autoload,以實現自動加載相關的類文件.這有些類似於我們在 .pch中全局引入某個頭文件,然后整個工程處處可用一樣.
- php 是一種弱類型語言,你定義變量時不必聲明類型,但是變量要以 美元符號 $開頭.
- php 使用 new 函數來創建一個對象,語法是
new 類名()
,這不禁讓我想起 oc 中的 new函數,它的語法是: [類名 new]; - php 中的函數,看起來更像是C語言函數,也許說更像 oc 中的block,可能更好理解些.
- php 訪問屬性,使用的是
->
,而不是.
;另一種 php 訪問屬性的方式是使用obj['屬性名']
,如$controller['model'].
此時你訪問 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,應該會報錯:
syntax error, unexpected '>' in /Applications/XAMPP/xamppfiles/htdocs/find_php/HomeViewController.php on line 38
因為你還沒有定義視圖控制器
Controller:定義視圖控制器
在find_php文件夾新建 HomeViewController.php 文件,並把下面的代碼復制進去:
<?php // HomeViewController.php
/* 建議一個文件中只有一個 與文件同名的類.
如果需要繼承自其他類,可以使用關鍵字 extends,如 */
class HomeViewController
{
/*
定義屬性,允許定義時,給屬性一個默認值,這一點比OC靈活.
public 關鍵字用於指定外部可訪問;
類似的還有 private(僅允許內部訪問),protected(僅允許自身及其子類訪問);
屬性前必須有關鍵字 public/private/protected 中的一個.
*/
public $model = array(); // 定義允許外部訪問的屬性.
/* 構造函數,相當於init初始化方法;
當調用New 函數新建對象時,此方法會被自動調用;
array 指明參數類型, $model是實參, $model = array(),用於指定默認參數;
指定了默認參數的參數,在調用時,可以不傳;
public 關鍵字作用等同於屬性的關鍵字,默認可以不傳,不傳則為public;
*/
public function __construct(array $model = array())
{
/* 在實例方法內部訪問對象的屬性,使用 $this 關鍵字,且屬性名前沒有美元符號$;
類似於 oc 中的self,但是使用的是 `->` 而不是 `.` */
$this->model = $model;
}
/*
析構函數,作用和 oc 中的dealloc很像.
*/
public function __destruct()
{
$this->model = NULL;
}
/* 獲取內容,用於輸出顯示. */
protected function getContent()
{
/* 默認把用戶輸入以JSON格式返回 */
$content = json_encode($this->model);
return $content;
}
/*
定義實例方法:show;
定義方法使用的是關鍵字 function,且無法指定返回值,這點不如 oc 方便;
*/
public function show()
{
/* 使用$this關鍵字來調用另一個實例方法. */
$content = $this->getContent();
echo $content;
}
}
此時你訪問 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,輸出應該是:
{"id":"42","name":"iOS122","age":"25"}
說明,頁面的確跳轉到了 HomeViewController控制器,並有效輸出;而且輸出的是我們移動端開發最常接觸的 json 格式的數據.
以上的代碼,充分展示了php作為一門面向對象(OOP)語言最常用的幾個功能,如定義屬性,定義實例方法,在示例方法內訪問屬性與實例方法等.PHP作為一門弱類型的OOP語言,也有一些非常強大的特性,推薦閱讀:
Model: 關於數據模型的幾點說明.
- 網上關於MVC中M的討論,此處我選取的是最基本的一種: M專指用於存儲某種數據的類的實例.它可以用於數據的格式化存儲和傳遞,但不應包含發起網絡請求和讀寫數據庫等操作;
- 在本文討論的Model中,我們進一步簡化了Model,允許且只允許用於通過URL來定義某個控制器的Model;
- PHP 是一本弱類型的語言,所以不必專門為某種控制器指定某種類型的Model.
- "PHP 中的數組實際上是一個有序映射。映射是一種把 values 關聯到 keys 的類型。此類型在很多方面做了優化,因此可以把它當成真正的數組,或列表(向量),散列表(是映射的一種實現),字典,集合,棧,隊列以及更多可能性。由於數組元素的值也可以是另一個數組,樹形結構和多維數組也是允許的。"
View: 一個顯示HTML的實例.
返回 JSON 格式的數據,已經達到了做移動端開發的需要,但此處仍然使用HTML語法來顯示數據,以便於更好地理解.用下面的代碼替換 HomeViewController.php 文件的 getContent 方法:
/* 獲取內容,用於輸出顯示. */
protected function getContent()
{
$content = '<html><body><ul>';
foreach ($this->model as $key => $value) {
$content .= "<li>$key:$value</li>";
}
$content .= '</ul></body></html>';
return $content;
}
此時你訪問 http://localhost/find_php/index.php?viewController=HomeViewController&model[id]=42&model[name]=iOS122&model[age]=25
,輸出應該是:
- id:42
- name:iOS122
- age:25
瀏覽器中會被自動解析為一個列表.對應的HTML代碼如下:
<html>
<head></head>
<body>
<ul>
<li>id:42</li>
<li>name:iOS122</li>
<li>age:25</li>
</ul>
</body></html>
此處使用了簡單的HTML標簽.
小結
本文通過模擬實現 iOS 的MVC的設計模式,來概要性地講解了PHP中的對應的各個概念.熟悉以上操作,可以使你具備自定義服務器接口的基本能力.參與討論,參見:http://www.ios122.com/tag/php/ 更全面地信息,參見PHP官方中文文檔: http://ua2.php.net/manual/zh/langref.php.