# PHP編碼標準
PHP標記的WordPress代碼結構的一些部分在其風格上是不一致的。 WordPress正在努力通過幫助用戶保持一致的風格逐漸改進,以便代碼可以一目了然地變得干凈,易于閱讀。
在為WordPress編寫PHP代碼時,請注意以下幾點:無論是核心編程代碼,插件或主題。 這些指南在許多方面與Pear標準類似,但在一些關鍵方面有所不同。
## PHP
### 單引號和雙引號
酌情使用單引號和雙引號。 如果您不評估字符串中的任何內容,請使用單引號。 你應該幾乎不必在字符串中避免引號,因為你可以替代你的引用樣式,像這樣:
```
echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
echo "<a href='$link' title='$linktitle'>$linkname</a>";
```
進入屬性的文本應該通過`esc_attr()`運行,以便單引號或雙引號不會結束屬性值并使HTML無效并導致安全問題。 有關詳細信息,請參閱食典中的數據驗證。
### 縮進
您的縮進應始終反映邏輯結構。 使用真實的選項卡而不是空格,因為這允許客戶端具有最大的靈活性。
異常:如果你有一個代碼塊,如果事情是對齊的,可以更容易讀取,使用空格:
```
[tab]$foo = 'somevalue';
[tab]$foo2 = 'somevalue2';
[tab]$foo34 = 'somevalue3';
[tab]$foo5 = 'somevalue4';
```
對于關聯數組,值應從新行開始。 注意最后一個數組項之后的逗號:建議這樣做,因為它可以更容易地改變數組的順序,并在添加新項時使更清晰的差異。
```
$my_array = array(
[tab]'foo' => 'somevalue',
[tab]'foo2' => 'somevalue2',
[tab]'foo3' => 'somevalue3',
[tab]'foo34' => 'somevalue3',
);
```
>[info] 經驗法則:應在起始處使用標簽進行縮進,而中間線可用于對齊。
### 大括號風格
大括號應用于所有塊中,如下所示:
```
if ( condition ) {
action1();
action2();
} elseif ( condition2 && condition3 ) {
action3();
action4();
} else {
defaultaction();
}
```
此外,如果你有一個很長的塊,可以考慮它是否可以分成兩個或更多個更短的塊或者功能。 如果你認為這么長的一個塊是不可避免的,那么請稍等一下,所以人們可以一眼就知道結束大括號是結束的 - 通常情況下這個邏輯塊大約是35行,而不是直觀的代碼 明顯可以注釋。
大括號應始終使用,即使不需要使用:
```
if ( condition ) {
action0();
}
if ( condition ) {
action1();
} elseif ( condition2 ) {
action2a();
action2b();
}
foreach ( $items as $item ) {
process_item( $item );
}
```
>[warning] 請注意,使用大括號只意味著禁止使用單一語句的內聯控制結構。 您可以自由地使用控制結構的替代語法(例如,if / endif,while / endwhile) - 特別是在HTML代碼嵌入的模板中,例如:
```
<?php if ( have_posts() ) : ?>
<div class="hfeed">
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID() ?>" class="<?php post_class() ?>">
<!-- ... -->
</article>
<?php endwhile; ?>
</div>
<?php endif; ?>
```
### 使用 `elseif`不是 `else if`
else if 不符合if | elseif 塊的規范語法。 因此,使用elseif作為條件。
### 正則表達式
應該使用Perl兼容的正則表達式(PCRE,preg_函數)優于其POSIX對等體。 切勿使用/ e開關,請改用preg_replace_callback。
對于正則表達式,使用單引號的字符串是最方便的,因為與雙引號字符串相反,它們只有兩個元素:\'和\\。
### 簡化PHP開始標簽
> 重要提示:切勿使用簡化的PHP開始標簽。 始終使用完整的PHP標簽。
**正確:**
```
<?php ... ?>
<?php echo $var; ?>
```
**不正確:**
```
<? ... ?>
<?= $var ?>
```
### 刪除每行代碼末尾的尾隨空格
刪除每行代碼末尾的尾隨空格。 在文件末尾省略關閉的PHP標簽是首選。 如果您使用該標簽,請確保刪除尾隨的空格。
### 空間使用
始終將空格放在逗號之后,并在邏輯,比較,字符串和賦值操作符的兩邊。
```
x == 23
foo && bar
! foo
array( 1, 2, 3 )
$baz . '-5'
$term .= 'X'
```
在if,elseif,foreach,for和switch塊的開頭和右括號的兩側放置空格。
`foreach ( $foo as $bar ) { ...`
定義一個函數時,可以這樣做:
`function my_function( $param1 = 'foo', $param2 = 'bar' ) { ...`
調用函數時,請執行以下操作:
`my_function( $param1, func_param( $param2 ) );`
執行邏輯比較時,可以這樣做:
```
if ( ! $foo ) { ...
```
當進行類型轉換時,請執行以下操作:
```
foreach ( (array) $foo as $bar ) { ...
$foo = (boolean) $bar;
```
當引用數組項時,如果索引是一個變量,則只包括索引周圍的空格,例如:
```
$x = $foo['bar']; // correct
$x = $foo[ 'bar' ]; // incorrect
$x = $foo[0]; // correct
$x = $foo[ 0 ]; // incorrect
$x = $foo[ $bar ]; // correct
$x = $foo[$bar]; // incorrect
```
### 格式化SQL語句
格式化SQL語句時,如果要保證SQL語句非常復雜,您可以將其分解成多行并縮進。 盡管如此,大多數的聲明都是一致的。 始終將語句的SQL部分大寫,如UPDATE或WHERE。
更新數據庫的函數應該期望它們的參數在傳遞時缺少SQL斜杠轉義。 應盡可能接近查詢時間完成轉義,最好使用$ wpdb-> prepare()
$ wpdb-> prepare()是一種處理SQL查詢的轉義,引用和int-cast的方法。 它使用sprintf()格式的一個子集。 示例:
```
$var = "dangerous'"; // raw data that may or may not need to be escaped
$id = some_foo_number(); // data we expect to be an integer, but we're not certain
$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );
```
%s 用于字符串占位符,%d用于整數占位符。 請注意,它們不是“引用”! $ wpdb-> prepare()將照顧轉義和引用我們。 這樣做的好處是我們不需要記住手動使用esc_sql(),而且很容易看到有沒有被轉義,因為查詢發生時會發生。
有關詳細信息,請參閱食典中的數據驗證。
### 數據庫查詢
避免直接觸碰數據庫。 如果有一個定義的函數可以獲取所需的數據,請使用它。 數據庫抽象(使用函數而不是查詢)有助于保持您的代碼向前兼容,并且在結果緩存在內存中的情況下可以快很多倍。
如果您必須觸摸數據庫,請通過向wp-hackers郵件列表發送消息與某些開發人員聯系。 他們可能想考慮為下一個WordPress版本創建一個功能來覆蓋您想要的功能。
### 命名約定
在變量,動作和函數名中使用小寫字母(絕對不是camelCase)。 通過下劃線分隔單詞。 不要不必要地縮寫變量名稱; 讓代碼明確和自我記錄。
```
function some_name( $some_variable ) { [...] }
```
類名應使用以下劃線分隔的大寫字。 任何首字母縮略詞都應該是大寫的。
```
class Walker_Category extends Walker { [...] }
class WP_HTTP { [...] }
```
常量應該是大寫的,用下劃線分隔單詞:
```
define( 'DOING_AJAX', true );
```
文件名使用小寫。 連字符應該分開單詞。
`my-plugin-name.php`
類文件名應基于具有類前綴的類名稱,類名稱中的下劃線用連字符替換,例如WP_Error成為:
`class-wp-error.php`
此文件命名標準適用于具有類的所有當前和新文件。 有三個文件包含已被移植到BackPress的代碼的一個例外:class.wp-dependencies.php,class.wp-scripts.php,class.wp-styles.php。 這些文件是前面加上類,一個點后面的單詞類,而不是一個連字符。
包含wp-includes中的模板標簽的文件應該將-template附加到名稱的末尾,以使它們顯而易見。
`general-template.php`
### 函數參數的默認值
在調用函數時,將字符串值設為true和false。
```
// 不正確
function eat( $what, $slowly = true ) {
...
}
eat( 'mushrooms' );
eat( 'mushrooms', true ); // what does true mean?
eat( 'dogfood', false ); // what does false mean? The opposite of true?
```
由于PHP不支持命名參數,因此標志的值是無意義的,每次遇到如上例所示的函數調用時,我們必須搜索函數定義。 通過使用描述性字符串值而不是布爾值,可以使代碼更易讀。
```
// Correct
function eat( $what, $speed = 'slowly' ) {
...
}
eat( 'mushrooms' );
eat( 'mushrooms', 'slowly' );
eat( 'dogfood', 'quickly' );
```
當需要更多的單詞來描述函數參數時,$args數組可能是更好的模式。
```
// Even Better
function eat( $what, $args ) {
...
}
eat ( 'noodles', array( 'speed' => 'moderate' ) );
```
### 命名動態掛鉤插值
應使用插值命名動態掛鉤,而不是為了可讀性和可發現性而連接。
動態掛鉤是掛鉤,包括其標簽名稱中的動態值,例如 {$new_status} _ {$post-> post_type}(publish_post)。
鉤子標簽中使用的變量應該包裹在花括號{和}中,完整的外部標簽名稱用雙引號括起來。 這是為了確保PHP可以正確解析插入字符串中給定的變量的類型。
`do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );`
在可能的情況下,標簽名稱中的動態值也應盡可能簡潔明了。 $ user_id比$ this-> id更為自我記錄。
### 三元運算符
三元運算符是好的,但是如果聲明是真的,那么總是讓它們進行測試,而不是假的。 否則,它只會變得混亂。 (一個例外是使用!empty(),因為這里的false的測試一般比較直觀。)
例如:
```
// (if statement is true) ? (do this) : (else, do this);
$musictype = ( 'jazz' == $music ) ? 'cool' : 'blah';
// (if field is not empty ) ? (do this) : (else, do this);
```
### 條件
```
if ( true == $the_force ) {
$victorious = you_will( $be );
}
```
當進行涉及變量的邏輯比較時,始終將變量放在右側,并將常量,文字或函數調用放在左側。 如果雙方都不是變量,則順序并不重要。 (在計算機科學方面,比較中總是試圖把左值的左值和右值放在左邊。
在上面的例子中,如果你省略了一個等號(承認它,甚至發生在我們最經驗的人),你會得到一個解析錯誤,因為你不能像一個常量那樣分配。 如果聲明是相反的($the_force = true),則賦值將完全有效,返回1,導致if語句評估為true,您可以追蹤該錯誤一段時間。
有點奇怪,就是閱讀。 習慣了,你會的。
這適用于==,!=,===和!==。 對于<,>,<=或> =的Yoda條件顯然難以閱讀,最好避免。
### 聰明的代碼
一般來說,可讀性比聰明或簡潔更重要。
`isset( $var ) || $var = some_function();`
雖然上面的這一行很聰明,但如果你不熟悉它需要一些時間。 所以,只是寫這樣:
```
if ( ! isset( $var ) ) {
$var = some_function();
}
```
###錯誤控制運算符 @
如PHP文檔中所述:
PHP支持一個錯誤控制運算符:at符號(@)。 在PHP中添加表達式時,可能會忽略該表達式生成的任何錯誤消息。
雖然這個操作系統確實存在于Core中,但它通常被懶惰地使用,而不是進行適當的錯誤檢查。 它的用法非常不鼓勵,即使PHP文檔也說明:
警告:目前,“@”錯誤控制運算符前綴甚至可以關閉將終止腳本執行的關鍵錯誤的錯誤報告。 除此之外,這意味著如果您使用“@”來抑制特定功能的錯誤,或者它不可用或已輸入錯誤,那么腳本就會在那里死亡,沒有指示為什么。
extract()是一個可怕的函數,使代碼更難調試,更難理解。 我們應該阻止它的使用和刪除我們的所有用途。
- 簡介
- 主題開發
- WordPress許可證
- 什么是主題
- 開發環境
- 主題開發示例
- 主題基礎
- 模板文件
- 主樣式表(style.css)
- 文章類型
- 規劃主題文件
- 模板層級
- 模板標簽
- 循環
- 主題函數
- 連接主題文件和目錄
- 使用CSS和JavaScript
- 條件標簽
- 類別,標簽和自定義分類
- 模板文件
- 內容模板文件
- 頁面模板文件
- 附件模板文件
- 自定義內容類型
- 部分和其他模板文件
- 評論模板
- 分類模板
- 404頁面
- 主題功能
- 核心支持的功能
- 管理菜單
- 自定義Headers
- 自定義Logo
- 文章格式
- 置頂文章
- Sidebars
- Widgets
- 導航菜單
- 分頁
- 媒體
- Audio
- Images
- Galleries
- Video
- 精選圖片和縮略圖
- 國際化
- 本地化
- 輔助功能
- 主題選項 – 自定義API
- 定制對象
- 改進用戶體驗的工具
- 定制JavaScript API
- JavaScript / Underscore.js渲染的自定義控件
- 高級用法
- 主題安全
- 數據消毒/逃避
- 數據驗證
- 使用隨機數
- 常見漏洞
- 高級主題
- 子主題
- UI最佳實踐
- JavaScript最佳做法
- 主題單元測試
- 驗證你的主題
- Plugin API Hooks
- 發布你的主題
- 所需的主題文件
- 測試
- 主題評論指南
- 寫文檔
- 提交你的主題到WordPress.org
- 參考文獻
- 模板標簽列表
- 條件標簽列表
- 編碼標準
- HTML編碼標準
- CSS編碼標準
- JavaScript編碼標準
- PHP編碼標準
- 插件開發
- 插件開發簡介
- 什么是插件
- 插件基礎
- 頭部要求
- 包括軟件許可證
- 啟用 / 停用 Hooks
- 卸載方法
- 最佳做法
- 插件安全
- 檢查用戶功能
- 數據驗證
- 保護輸入
- 保護輸出
- 隨機數
- Hooks
- Actions
- Filters
- 自定義Hooks
- 高級主題
- 管理菜單
- 頂級菜單
- 子菜單
- 短代碼
- 基本短碼
- 封閉短碼
- 帶參數的短代碼
- TinyMCE增強型短碼
- 設置
- 設置API
- 使用設置API
- 選項API
- 自定義設置頁面
- 元數據
- 管理帖子元數據
- 自定義元數據
- 渲染元數據
- 自定義文章類型
- 注冊自定義文章類型
- 使用自定義文章類型
- 分類
- 使用自定義分類
- 在WP 4.2+中使用“split術語”
- 用戶
- 創建和管理用戶
- 使用用戶元數據
- 角色和功能
- HTTP API
- JavaScript
- jQuery
- Ajax
- 服務器端PHP和入隊
- Heartbeat API
- 概要
- 計劃任務
- 了解WP-Cron計劃
- 安排WP-Cron 事件
- 將WP-Cron掛接到系統任務計劃程序中
- WP-Cron簡單測試
- 國際化
- 本地化
- 如何國際化您的插件
- 國際化安全
- WordPress.org
- 詳細插件指南
- 規劃您的插件
- 如何使用Subversion
- 插件開發者常見問題
- 開發工具
- Debug Bar 和附加組件
- 輔助插件
- REST API手冊
- 資源
- 文章
- 文章修訂
- 文章類型
- 文章狀態
- 類別
- 標簽
- 頁面
- 評論
- 分類
- 媒體
- 用戶
- 設置
- 使用REST API
- 全局參數
- 分頁
- 鏈接和嵌入
- 發現
- 認證
- 經常問的問題
- 骨干JavaScript客戶端
- 客戶端庫
- 擴展REST API
- 添加自定義端點
- 自定義內容類型
- 修改回應
- 模式
- 詞匯表
- 路由和端點
- 控制器類