用 PHP5 打造簡易的 MVC 架構

起始工作

啟始檔案用來做一般的啟動工作,像定義常數、設定錯誤回報等級等等,我們起始檔案的第一部份像這樣:

<?phperror_reporting (E_ALL);

if (version_compare(phpversion(), ‘5.1.0’, ‘<‘) == true) { die (‘PHP5.1 Only’); }

// Constants:

define (‘DIRSEP’, DIRECTORY_SEPARATOR);

// Get site path

$site_path = realpath(dirname(__FILE__) . DIRSEP . ‘..’ . DIRSEP) . DIRSEP;

define (‘site_path’, $site_path);

在上面的例子中我們定義了一些常數,取得網站路徑,還有確認PHP的版本是否比5.1還新。

接下來我們必須做的是設定Registry物件來保有我們所有的全域資料,registry物件會在我們的MVC系統裡在所有的個別物件間傳來傳去,它是用來傳送全域資料這樣我們在系統中就不須用到’global’關鍵字或是$GLOBALS,你可以閱讀這一篇“Using globals in PHP”來了解registry物件的資訊。

新增下面的程式碼到startup.php檔中,下面的程式碼是從前一個例子來的:

$registry = new Registry;

假如你現在試著要執行系統,你會得到下面的錯誤:

Fatal error: Class ‘Registry’ not found in g:ProjectsPHPitcontentsimple mvc php5demoincludesstartup.php on line 12

不要太驚訝,因為我們尚未建構Registry類別,我們也沒有將有Registry類別的檔案含括進來,我們可以簡單地使用include函式來含括但是讓我們來使用PHP5的新功能:__autoload()。

這個__autoload()神奇函式用來動態載入類別,當PHP碰到不存在的類別時,它會優先呼叫__autoload()函式,只是當時會宣佈錯誤,這個可以快速用來載入類別。

將下面的程式碼放在前面的範例程式碼

// For loading classesfunction __autoload($class_name) {

$filename = strtolower($class_name) . ‘.php’;
$file = site_path . ‘classes’ . DIRSEP . $filename;

if (file_exists($file) == false) {

return false;

}

include ($file);

}

我們的 __autoload()函式會取得類別名稱,傳遞引數,並且確認是否有相同的檔案名稱在類別的目錄中,假如檔案沒有存在,函式會傳回false,而且致命的fatal錯誤仍會產生,但是假如檔案存在,它就會被含括進來,也就是說這個類別會突然地在那,而且沒有錯誤會產生。

我們尚未建構Registry類別,所以我們還是會得到一個錯誤,所以讓我們做一些事來處理。

Creating the Registry class

Registry類別用在個別的物件之間傳遞全域的資料,而且只是一個小小的類別,通常不會有超過3個以上的小方法。

首先建立一個叫做’classes’的目錄,然後新增一個’registry.php’檔案,將下面的程式碼放進registry.php:

<?phpClass Registry {

private $vars = array();

}

?>

我們現在已有一個Registry類別的架構,而我們所要做的就是新增方法,所有的Registry類別需要一個set()方法來設定資料,以及一個get()方法來取得資料,另外我們也可選擇要不要新增一個remove()方法來移除資料,下面的程式碼會新增這三個方法:

function set($key, $var) {if (isset($this->vars[$key]) == true) {
throw new Exception(‘Unable to set var `’ . $key . ‘`. Already set.’);

}

$this->vars[$key] = $var;

return true;

}

function get($key) {

if (isset($this->vars[$key]) == false) {

return null;

}

return $this->vars[$key];

}

function remove($var) {

unset($this->vars[$key]);

}

正如同你所看到的,這三個方法實在簡單,他們所作的就是從$vars屬性中設定、取得及刪除事項,在set()方法中我們也確認特殊的key是否不存在,假如存在我們會丟出一個例外,這是為避免偶然地複寫資料。

我們現在有一個完整的Registry類別,但是我們還沒有要停止,我們要使用SPL的其中一個功能:ArrayAccess,SPL是Standard PHP Library的縮寫,它是一個集合用來解決標準問題的介面及類別,SPL其中的一個介面ArrayAccess可以讓陣列存取物件,看看下一段的程式碼:

<?php$registry = new Registry;

// Set some data

$registry->set (‘name’, ‘Dennis Pallett’);

// Get data, using get()

echo $registry->get (‘name’);

// Get data, using array access

echo $registry[‘name’]

?>

陣列存取使得$registry看起來像是陣列即使它是物件,雖然ArrayAccess沒有真正的用處,它可以讓我們少key一些字這樣子就不用一直使用->get(),要使用ArrayAccess首先你必須改變(“Class Registry”)的第一行,變成這樣:

Class Registry Implements ArrayAccess {

Implements關鍵字用來實作介面,而那就是ArrayAccess的功能。

藉著實作ArrayAccess介面,這個類別也需要新增四個方法:

function offsetExists($offset) {return isset($this->vars[$offset]);
}

function offsetGet($offset) {

return $this->get($offset);

}

function offsetSet($offset, $value) {

$this->set($offset, $value);

}

function offsetUnset($offset) {

unset($this->vars[$offset]);

}

這些方法應該相當明顯,更多的資訊可以在SPL documentation找到。

現在我們已經實作ArrayAccess,我們可以使用物件就像使用陣列一樣,就像你在前面例子看到一樣,也可以在下面例子看到:

<?php$registry = new Registry;

// Set some data

$registry->[‘name’] = ‘Dennis Pallett’;

// Get data, using get()

echo $registry->get (‘name’);

// Get data, using array access

echo $registry[‘name’]

?>

我們的Registry現在已經完成,而且假如你試著執行系統每件事應該都可以運作(雖然沒有任何東西顯示),我們的起始檔案完成,我們可以移到我們MVC系統下一步:設定資料庫功能,也叫做”Model”。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

頁次: 1 2 3 4 5

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *