CCAPS
外觀
CCAPS,或Carefully-Controlled Alternative PHP Syntax,是 網頁模板系統,作為 Smarty 和 CakePHP 等模板引擎的替代方案。CCAPS 的發音為Cee-Caps,是 PHP 網頁開發者可以用來將 XHTML 原始碼與程式設計邏輯分離,同時將兩者很好地結合在一起,而不會引入 義大利麵條程式碼。
許多開發者更喜歡它,而不是像 Smarty 這樣的引擎,因為
- 它的架構更輕薄,因此執行速度更快
- 使用大多數 PHP 開發者已經瞭解的概念
- PHP 本身就是一個很棒的模板引擎
- PHP 已經提供了條件和控制流功能
- 不需要額外的安裝步驟
- 保證它不會在你的伺服器上崩潰,因為它不包含任何額外的庫 - 沒有額外的功能新增來確保你已經安裝了
- 它更具適應性
PHP 已經有了 Alternative PHP Syntax,但 CCAPS 所做的就是以下指南
- 模板頁面以副檔名 ".php" 結尾,除非其他安排允許將它們載入到一個人的編輯器中,並對原始碼進行適當的彩色格式化,並且除非 Apache 指令允許某些其他副檔名像 PHP 頁面一樣被處理。
- 模板放在名為 "views" 的資料夾中,並且有 Apache 訪問控制,以便這些頁面可以被包含,但不能被終端使用者直接檢視。
- 所有模板檔名必須以小寫字母 "v" 開頭,代表 "View"。在 MVC 框架 中,模板是一個檢視。例如,一個檔案可以命名為 vLogin.php。這個 "v" 有助於在一個文字編輯器中更容易地區分檢視和頁面控制器,頁面控制器可能被稱為,例如,Login.php。
- 為了將 PHP 值放入 XHTML 中,使用 PHP 常量變數。PHP 常量變數僅以大寫字母形式包含在 XHTML 中,以便在通常為小寫字母的 XHTML 原始碼中更容易識別。
- PHP 常量變數被包含為 <?= MYVAR ?>,以便使用盡可能少的按鍵,而不是 <?php echo MYVAR; ?>。如果這需要在 Apache 設定中進行更改,或者在 PHP 的編譯或配置方式中進行更改,則會進行相應調整。
- 作為一項基本規則,在一個給定的 XHTML 頁面中,只允許使用三個 (3) if/then 條件。如果需要更多,則強烈建議將它們移動到單獨的更小的檢視檔案中,或者透過函式或物件方法在呼叫頁面的程式設計邏輯中編寫 XHTML,然後作為單個變數傳遞到 XHTML 模板中。這可以使原始碼保持乾淨,並使其更容易編輯。
- 強烈建議不要使用巢狀的 if/then 條件,如果有必要,應該在呼叫 PHP 頁面(頁面控制器)中編寫 XHTML,並傳遞給檢視進行插入。
- if/then 條件只允許使用不帶花括號的備用語法樣式,例如
<? if (TAB == 'main'): ?> <xhtml goes here> <? else: ?> <xhtml goes here> <? endif; ?>
- 不允許使用任何迴圈。相反,這種功能必須在呼叫頁面的程式設計邏輯中建立,通常透過一個包含的函式或物件方法,然後作為單個大寫變數插入此頁面模板的 XHTML 原始碼中。
- 除了 if/then 之外,不允許使用其他條件邏輯,例如 select/case 邏輯。相反,這種邏輯必須在呼叫頁面中實現。
- 模板應該在一個單獨的檔案中包含頁首或頁尾。此檔案通常以大寫字母命名,例如 vHEADER1.php,vFOOTER2.php,以便在模板資料夾中更容易找到。
- 對於需要側邊欄的頁面,這可能更適合作為更小的檢視檔案編寫,並以這種方式包含。
- 通常,在一個 PHP 類中編寫一組靜態方法來處理此模板是合適的,例如...
View::Assign('MYVAR','This is my test');
View::Display('vMain.php');
...而 Display 方法自動假設 vMain.php 位於名為 "views" 的子資料夾中。
- 另一個指南是需要提醒一下。由於我們使用常量,你需要注意 PHP 的一個鮮為人知的特性,即如果你試圖顯示一個未定義的常量,它會顯示變數名稱,這可能是完全出乎意料和不穩定的。因此,如果你只對一個帶有 if/then 條件的變數執行 View::Assign(),而沒有提供相同的 View::Assign() 來建立一個預定義的空值常量,那麼 PHP 將自動顯示該常量作為它自己的變數名稱。因此,要注意...
<?php
require_once('classes/View.php');
if (empty($_POST['name'])) {
View::Assign('ERRORMSG','No name was provided');
}
View::Display('vTest.php');
<?php ?> <?= ERRORMSG ?>
...這將導致單詞 'ERRORMSG' 出現在頁面上。解決方法是
<?php
require_once('classes/View.php');
$sErr = '';
if (empty($_POST['name'])) {
$sErr = 'No name was provided';
}
View::Assign('ERRORMSG',$sErr);
View::Display('vTest.php');
<?php ?> <?= ERRORMSG ?>
大多數 PHP 安裝已經支援 CCAPS,不需要安裝額外的庫。
一個示例檢視類可能如下所示。
<?php
class View {
const ENCODE_DEFAULT = 0;
const ENCODE_HTML = 1;
const ENCODE_URL = 2;
function Assign($sVarName, $sVal, $nType = self::ENCODE_DEFAULT) {
switch ($nType) {
case self::ENCODE_HTML: // show the html
$sVal = htmlentities($sVal);
break;
case self::ENCODE_URL: // prepare for urls
$sVal = urlencode($sVal);
break;
default: // 0, default, as is, unaltered
break;
}
$sVarName = strtoupper($sVarName);
define($sVarName, $sVal);
}
function Display($sTemplateFile) {
$sScriptName = $_SERVER['SCRIPT_NAME'];
$sBaseName = basename($sScriptName);
define('U',str_replace($sBaseName,'',$sScriptName));
$sPath = dirname(__FILE__);
$sPath = str_replace('classes','',$sPath);
require_once($sPath . 'views/' . $sTemplateFile);
}
}
因此,作為示例,你可以有一個 test.php,它看起來像
<?php
require_once('classes/View.php');
View::Assign('TEST','This is my test.');
View::Display('vTest.php');
然後,你的 vTest.php 可能看起來像
<?php ?> <html> <head><title>Test</title></head> <body> <?= TEST ?> </body> </html>
請注意我們使用 TEST 而不是 $TEST。這是因為它是一個常量。這不僅可以阻止可能導致義大利麵條程式碼的濫用,而且比在我們的 View 類中使用全域性變數陣列技術來載入和解除安裝從一個 PHP 頁面傳遞到另一個 PHP 頁面的變數要快得多。