PHP開発コーディング標準

WBOY
WBOYオリジナル
2016-06-13 13:09:58894ブラウズ

PHP 開発コーディング標準
PHPを書いていると標準化の重要性をますます感じます 今日ネットで先輩が書いた記事を見かけたので、ひっくり返して勉強してみました。元のアドレスは次のとおりです: http://blog.csdn.net/alexdream/article/details/2213313

1 執筆の目的
技術部門の作業効率を向上させ、開発の有効性と有効性を合理的に考慮し、プログラムコードの可読性と再利用性を最大限に高めることができる仕様書を規定します。開発チームは、実際の状況に基づいてこの仕様を補足または削減することができます。

2 全体要件
技術部門の PHP 開発仕様は、PEAR の仕様を参照し、基本的には PEAR が指定する仕様を採用し、これに基づいて、特定の開発環境に適した仕様の追加、修正、または追加が行われます。削除されました。この仕様は、PHP 開発プロセスにおけるコーディング仕様のみに焦点を当てています。PHP 開発プロジェクトにおけるファイル、ディレクトリ、データベースなどの仕様には焦点を当てません。
この仕様には、命名規則、コードのインデント規則、制御構造、関数呼び出し、関数定義、コメント、コードを含むコメント ブロック、PHP タグ、ファイル ヘッダー、CVS タグ、および PHP 開発中のプログラム コーディングの URL サンプルが含まれます。定数の名前付けなどに。

3 セキュリティ仕様

3.1 インクルードファイル

3.1.1 命名規則
共通の機能を持つインクルードファイルを抽出し、ファイル拡張子は .inc で命名されます。 、これはインクルード ファイルであることを示します。
複数のページを含める必要がある .inc ファイルが複数ある場合は、すべての .inc ファイルを 1 つのファイルにカプセル化してください。
例: xxx_session.inc
xxx_comm..inc
xxx_setting.inc
mysql_db.inc

次の方法で上記のファイルを xxx.basic.inc ファイルにカプセル化します
require_once("xxx_session.inc " );
require_once("xxx_comm.inc");
require_once("xxx_setting.inc");
require_once("mysql_db.inc");

注:ファイルをパッケージ化する場合、状況によっては、各 Inc の機能が異なるページに分散している場合、カプセル化はお勧めできません。

3.1.2 格納ルール
通常、インクルードされたファイルはユーザーに直接公開する必要がないため、Web サーバーからアクセスできないディレクトリに配置し、設定情報の漏洩を避ける必要があります。構成の問題。

3.2 安全規則
製品の安全性チェックリストを参照してください。

入力と出力
HTML コードのフィルタリングが行われているかどうかを確認します
考えられる問題: 誰かが悪意のある HTML コードを入力すると、Cookie が盗まれ、悪意のあるログイン フォームが生成され、Web サイトが破壊されます
チェックデータベース操作を実行する前に変数がエスケープされているかどうか
考えられる問題: クエリ ステートメントに書き込まれる文字列変数に、引用符 (',") やセミコロン (;) などの特定の特殊文字が含まれている場合、予期しない操作が発生する可能性があります。
推奨される方法: mysql_escape_string() または同様の関数を実装した関数を使用します。
考えられる問題: 値が異常であると、不正なデータまたは不正なデータが発生する可能性があります。
例:
の場合、プログラムは、ユーザーが入力したパラメータ値をファイル名として使用して、悪意のあるファイル操作を実行します。システム ファイル名はシステムに損傷を与える可能性があります。
Cookie の使用とユーザー データの処理を確認してください。
考えられる問題: Cookie の使用により、ユーザー データの漏洩が発生する可能性があります。
アクセス制御
社内またはパートナー向けに使用される製品の場合は、アクセス制御の追加を検討してください
ログ
ユーザーの機密情報がログに記録されていないことを確認してください 中 (例: ユーザーのパスワード)
完全なユーザー アクセス記録がキーに保存されていることを確認してくださいユーザー操作
https
機密データの送信には https を使用します


3.3 PHP のいくつかのルール
set register_globals = off (Y を使用する場合、Y!PHP は register_globals を無効にします) !PHP では、この設定は無視できます)
error_reporting = E_ALL (Y!PHP のデフォルト設定) を設定し、すべてのエラーと警告を修正します
実際の操作を参照ファイルに配置します。参照ファイルは、参照できないディレクトリに配置します。直接閲覧できる

3.4 その他の処理規則

3.4.1 入力パラメータ値のエスケープ
ページ上でパラメータを受け取る際にはSQL操作が必要です。特に ";"
例: $a = "Let's go" ;
$sql = "Insert into tmp(col)values('$a')" ;
この場合のエラーの不確実性

3.4.2 大きな HTML テキストの操作<.>多くの場合、ユーザーがカスタマイズしたヘッダーやフッターなど、HTML テキストの大きなセクションを保存する必要があります。悪意のある PHP コードの実行を避けるために削除する必要があります。
コードの整合性を確保するために「<」「>」の数値を変換します。

4 コーディング標準

4.1 命名標準
統一した命名標準を開発することは、プログラマにとって良い開発習慣を身に付けるだけでなく、プログラマの数を増やすことにもつながります。プログラムの可読性、移植性、再利用性により、プロジェクト開発の効率も大幅に向上します。

4.1.1 変数の名前付け
変数の命名は、通常変数、静的変数、ローカル変数、グローバル変数、セッション変数などの命名規則に分かれています。

4.1.1.1 通常の変数
通常の変数の命名は次の規則に従います。
a. すべての文字は小文字です。
b. 複数の単語を使用する変数の場合、各単語の間隔として「_」を使用します。
例: $base_dir、$red_rose_price など。

4.1.1.2 静的変数
静的変数の命名は次の規則に従います。
a. 静的変数は小文字の s_ で始まります。 静的変数内の文字はすべて小文字です。
c。 複数の単語で構成される変数名は、各単語の間隔として「_」を使用します。
例: $s_base_dir、$s_red_rose_prise など。

4.1.1.3 ローカル変数
ローカル変数の命名は次の規則に従います。
a. すべての文字に小文字を使用します。
b. 変数は「_」で始まります。c. 複数の単語で構成されるローカル変数名は、各単語の間隔として「_」を使用します。
例: $_base_dir、$_red_rose_price など。

4.1.1.4 グローバル変数
グローバル変数には接頭辞「g」を付ける必要があります。変数のスコープを知ることは非常に重要です。
例:
global $gLOG_LEVEL;
global $gLOG_PATH;

4.1.1.5 グローバル定数
グローバル変数の命名は次の規則に従います。
a. すべて大文字を使用してください
b. グローバル変数内の複数の単語間の区切り文字として「_」を使用します。
例: $BASE_DIR、$RED_ROSE_PRICE など。

4.1.1.6 セッション変数
セッション変数の命名は次の規則に従います。
a. すべて大文字を使用します
b.セッション変数名は「S_」で始まります。 複数の単語の間には「_」スペースを使用します。
例: $S_BASE_DIR、$S_RED_ROSE_PRICE など。

4.1.2 クラス
php でのクラスの名前付けは、次の規則に従います。
a. 大文字で始まる
b。 複数の単語で構成される変数名の場合は、単語の間にスペースを入れず、各単語の最初の文字を大文字にします。
例: クラス MyClass またはクラス DbOracle など。

4.1.3 メソッドまたは関数
メソッドまたは関数の命名は次の規則に従います。
a. 最初の文字は小文字です。
b. 複数の単語の間にスペースは使用されず、最初の文字を除く各単語の最初の文字は大文字になります。
例: function myFunction () または function myDbOracle () など。

4.1.4 略語
変数名またはその他の命名で略語が見つかった場合は、その略語の元のすべて大文字化方法を使用する代わりに、特定の命名規則を参照してください。
例: function myPear (myPEAR ではありません) function getHtmlSource (getHTMLSource ではありません)。

4.1.5 データベーステーブル名
データベーステーブル名の命名は次の仕様に従います。
a. テーブル名には小文字を使用します。
b. 通常のデータテーブルの場合は、_t 末尾
c を使用します。 ビューの場合は、_v 末尾
d を使用します。 複数の単語で構成されるテーブル名には、_interval を使用します。
例: user_info_t および book_store_v など

4.1.6 データベース フィールド
データベース フィールドの名前は次の仕様に従います。 すべて小文字を使用します
b. 複数の単語の間には _space を使用します。
例: user_name、rose_price など。


4.2 記述ルール
記述ルールは、インデント、構造制御、その他の規則の側面を含む、PHP プログラムを作成する際のコード記述のルールを指します。

4.2.1 コードインデント
コードを記述するときは、コードのインデント規則に注意する必要があります。コードのインデント規則は次のように規定されています。 タブ インデントの代わりに 4 つのスペースをインデントとして使用します (ウルトラエディットの場合は事前に設定できます)
例:
for ( $i=0;$i {
echo "test";
}

4.2.2 中括弧 { } の記述規則
if、for、while、switch およびその他の構造など、プログラム内で構造制御コードを記述するには、従来の 2 つの構造があります。次のような中括弧の書き方の習慣:
a. {
for ($i=0;$i<$count;$i++) {
echo "test";
}
など、改行なしで制御ステートメントの直後に続きます。 {制御ステートメントの次の行、
for($i=0;$i{
echo "test";
}
ここで、 a は PEAR が提案する方法ですが、実際の記述に関しては、プログラムの仕様や phpdoc を使用したドキュメントの実装には影響しませんので、個人の習慣に応じて上記 2 つの方法を使用できます。読み取りに不便を生じさせないように、同じプログラム内ではいずれか 1 つだけを使用する必要がありました。

4.2.3 括弧 ( )、関数、キーワードなど
括弧、キーワード、関数は次の規則に従います。
a. 括弧とキーワードを近くに配置せず、if ($a<$b); のようにスペースを使用して区切ります。 $test = date("ymdhis"); のように、括弧と関数名の間にスペースは入れません。 必要な場合を除き、Return ステートメントでは括弧を使用しないでください。 たとえば、 Return $a;

4.2.4 = シンボルの書き込み
プログラムでは = シンボルの書き込みは次の規則に従います。 = 記号の両側には、$a = $b、if ($a = = $b) などのようにスペースを残す必要があります。 宣言ブロック、または同じ関数を実装するブロックでは、= 記号をできる限り上下に揃える必要があります。左側には整列を維持するために複数のスペースを使用できますが、左側には 1 つのスペースが必要です。右側; 次のように:
$testa = $aaa ;
$testaa = $bbb;
$testaa = $ccc;

4.2.5 if else switch for while などの記述
制御構造の記述については、次の規則に従います。
a. if 条件の判定で、定数の判定条件を使用する場合は、例:
if (6 == $errorNum) のように、等号または不等号の左側に定数を置きます。方程式に署名すると、文法チェッカーがエラーを報告し、この種の記述に注意を払うことができます。
b.スイッチ構造にはデフォルトのブロックが必要です。
c. for ループと wiile ループを使用する場合は、goto と同様の問題を避けるために continue と Break の使用に注意してください。

4.2.6 クラス コンストラクター
クラス内でコンストラクターを作成する場合は、次のルールに従ってください:
a. コンストラクター内で実際の操作が多すぎることはできません。これは、一部の値と変数を初期化するためにのみ使用できます。 オブジェクトの宣言とインスタンス化の際にエラーを返すことができないため、コンストラクターでの操作の使用により false またはエラーを返すことはできません。

4.2.7 ステートメントの改行、各行は 80 文字に制限されます。コードを記述する場合は、次の原則に従ってください。
a. プログラムのステートメントが 1 行に 1 文になるようにし、ステートメントの行が長すぎて改行が生じないようにしてください。
b. コード行は長すぎないように注意してください。通常は 80 文字以内です。
c. コード行が長すぎる場合は、
d のような改行を使用してください。 データベースを実行する SQL ステートメント操作の場合は、関数内に SQL ステートメントを記述せず、まず変数を使用して SQL ステートメントを定義し、次に操作を実行する関数内で定義された変数を呼び出します。
例:
$sql; = "SELECT ユーザー名、パスワード、住所、年齢、郵便番号 FROM test_t ";
$sql .= " WHERE username='aaa'";
$res = mysql_query($sql);

4.2.8 信じられないような数字にしないでください
ソース コードで使用されている裸の数字は、作者を含めて 3 か月以内に誰も意味を理解できなかったので、信じられないほどの数字です。例:

if (22 == $foo)
{
start_thermo_nuclear_war();
}
else if (19 == $foo)
{
refund_lotso_money();
}
else
{
cry_cause_im_lost();
}
何かを表したい値に実際の名前を与えるには、define() を使用する必要があります。裸の数字を使用する代わりに、たとえば:

define("PRESIDENT_WENT_CRAZY", "22");
define("WE_GOOFED", "19");
define("THEY_DIDNT_PAY", " 16");

if ( PRESIDENT_WENT_CRAZY == $foo)
{
start_thermo_nuclear_war();
}
else if (WE_GOOFED == $foo)
{
refund_lotso_money();
}
else if (THEY_DIDNT_PAY == $foo)
{
infinite_loop();
}
else
{
happy_days_i_know_why_im_here ( );
}
4.2.9 真/偽および 0/1 判定
次のルールに従います。
a. PHP では、true/false の代わりに 0/1 を使用することはできません。
b. 真/偽判定を直接実行するためにゼロ以外の式、変数、メソッドを使用しないでください。ただし、厳密な完全な真/偽判定を使用する必要があります。
例: if ($a) または if (checka()) は使用しないでください。ただし、if (FALSE != $a) または if (FALSE != check()) を使用します

4.2.10 埋め込み代入を避ける
プログラム内の次の例では、埋め込み代入を避けてください:
いいえ次のメソッドを使用します:
while ($a != ($c = getchar()))
{
文字を処理します
}

4.2.11 エラー戻り検出ルール
エラーを無視したい場合を除き、すべてのシステムコールでエラーメッセージを確認してください。
各システム エラー メッセージのシステム エラー テキストを定義し、エラー ログを記録します。


4.3 プログラムのコメント
各プログラムは必要なコメントを提供する必要があります。コメントを記述するための要件は、将来 phpdoc を使用して php ドキュメントを生成する場合に備えて、PEAR によって提供されるコメント要件を参照してください。 。プログラム コメントの原則は次のとおりです。
a. ファイルヘッダーのコメントブロックを除いて、// コメントはコメント内の他の場所では使用されませんが、/* */ コメントは使用されます。 コメントの内容は、1 行以降ではなく、コメント対象のオブジェクトの前に記述する必要があります。

4.3.1 プログラム ヘッダーのコメント ブロック
各プログラム ヘッダーには、統一されたコメント ブロックが必要です。ルールは次のとおりです。以下のように:
a. プログラムの説明を含める必要があります
b. 著者を含める必要があります。
c. 執筆日を含める必要があります。
d. バージョン情報を含める必要があります。
e. プロジェクト名を含める必要があります。
f. ファイルの名前を含める必要があります
g。 クラスの呼び出し方法や注意事項など、重要な使用方法
参考例は以下のとおりです。

//
// +----- -- ---------------+
// PHP バージョン 4.0 --+
// | Copyright (c) 1997-2001 PHP グループ |
// +---------------+
// このソース ファイルには PHP ライセンスが適用されます |// |これはこの packagefile LICENSE にバンドルされており、 |
// |ワールドウェブから |
// | http://www.php.net/license/2_02.txt。                    |
// |のコピーを受け取っておらず、 |
// | を実行できない場合は、ワールドワイド ウェブを通じて入手し、メモを終了して |
// | License@php.net なので、すぐにメールでご連絡いたします。       |
// +----------+
// |著者: Stig Bakken                       |
// |          トーマス V.V.Cox                 |
// |                                                         |
// +----------+
//
// $Id: Common.php,v 1.8.2.3 2001/11/13 01:26:48 ssb Exp $
4.3.2 クラスの注释
クラスの注释採用里面の参考例子形式:

/**
* @Purpose:
* ユニバーサル アクセス インターフェイスとして ODBC を使用して、データベースにアクセスするためのクラス
* @Package Name: Database
* @Author: Forrest Gump Gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into() パラメーターの 2 番目と 3 番目の位置が交換されます
* John Johnson John@crtvu.edu.cn
* @See: (参考)
*/
class Database
{
……
}
4.3.3 関数とメソッドの注釈
関数とメソッドの注釈は、関数とメソッドの先頭にあり、同様の次の例の説明を採用しています。 :

/**
* @Purpose:
* クエリを実行します
* @Method Name: Query()
*
* @Param: string $queryStr SQL クエリ文字列
* @Param: string $username ユーザー名
*
* @Author: Michael Lee
*
* @Return: 混合クエリの戻り値 (結果セット オブジェクト)
*/
function($queryStr,$username)
{……}
4.3.4 变量または者语注释
程序中变量または者语句的注释準拠以下原文:
a. 同行またはその後に書かずに、量または句の先頭に書きます;
b. 注释採用/* */的方式;
c. 各関数には、最初に注釈ブロックが含まれます。関数の機能の説明、入出力パラメータ、予定の戻り値、出力コードが含まれます。 注释完全范。
e.
f.
例:

/**
* @Purpose:
* データベース接続ユーザー名
* @属性/変数名: db_user_name
* @Type: string
*/
var db_user_name;

4.4 その他规范(建议)

4.4.1 php代码标记
すべてのphp程序代网块标记はすべて

4.4を使用します。 2 プログラムファイル名、目録名
プログラムファイル名と目録名命名は両方とも慎重な英文形式の命名を採用し、音や無意の文字を使用せず、同時に小文字を使用する必要があり、複数の句には_間隔を使用します。

4.4.3 PHP 項目の一般的な文節構造構造
の公開時に独立した PHP 項目を作成する場合、これは目的の文節構造の健全性を高めるのに役立ちます。扩展
完全に独立した PHP アイテムの一般的なファイルとアイテム構造は次のとおりです:
/ メインアイテム
/manage 後台管理ファイル保存アイテム
/css css文件存放目录
/doc 存放项目文档
/images 全图片文件存放路径(在里面根据目录瞄设立子目录)
/scripts 客户端js 表示存放目录
/tpl 网站全htmlのバージョン文件存放目录
/error.php 错误処理文件(Apache の错误処理中に指定可能)

以上の目录構造は通常の目录構造であり、特定の用途の特定の状況に応じて、使用しないことを検討できます。

4.4.4 PHP と HTML コードの分離の問題
パフォーマンス要求がそれほど高いものではないため、PHP と HTML コードを直接混在させずに設計しました。 PHP と HTML コードを分離する方法、つまり、モードを使用する方法を使用してコードを書き換えるこの方法は、プログラムの構造をより明確にし、途中での分別作業の開始にも役立ち、同時に翌日の目的にも役立ちます。
は、非常に高いパフォーマンスが要求されるアプリケーションなど、特定の状況では、モード モードを使用しなくてもかまいません。4.4.5 PHP プロジェクト開発におけるプログラムのロジック構造
PHP プロジェクト開発では、OOP 開発の考え方を取り入れるようにしてください。特に PHP5 以降では、オブジェクト指向開発機能が大幅に向上しています。
PHP プロジェクトでは、ビジネス ロジック全体に対応する独立した機能モジュールをできる限り関数呼び出しとして記述することをお勧めします。これにより、コードの可読性が向上するだけでなく、コードの可読性も向上します。コードの再利用性。たとえば、通常、データベース インターフェイスをデータベース クラスにカプセル化します。これは、プラットフォームの移植に役立ちます。
重複したコードは公開ライブラリに作成する必要があります。 (プラグイン製品を除いて、この製品シリーズには同様の製品が複数あります。インストールパッケージのサイズを可能な限り削減するために、これらの製品で共有されるすべての機能を 1 つのパッケージにまとめることは適切ではありません)パブリック ライブラリ)

5 特定の環境での PHP コーディングの特別な仕様

5.1 変数の定義
XXX 環境で PHP コードを記述するには、使用する前にすべての変数を宣言する必要があります。たとえば、配列の場合、不確実なキーを使用する場合は、最初に isset() を判断してから、次のコードを使用します。 isset($array[ 3]) ? $array[3]: "";

5.2 参照の使用
追加を必要とせずに同じメモリを共有するために、参照がよく使用されます。 XXX 環境でのコピー 参照を使用する場合、次の状況に注意する必要があります。
関数の入力パラメータで参照を使用する場合、呼び出し時に参照する入力パラメータの前に & を追加することはできません。変数を直接定義すると同時に、次のコードのように、入力パラメーターが参照から取得されることを指定する必要があります。 🎜>{
$var ++;
return $ var;
}
$b = ab($a) // ここでは $b = ab(&$a) は使用できないことに注意してください;
echo $b.”n”;
echo $a.”n”;
この時点では、$a と $b は両方とも 2;

参照の特別な要件XXX環境では、php.iniファイルのallow_call_time_pass_reference項目の設定から派生します。公開バージョンはOnであり、参照用の関数を呼び出すときに変数の先頭に&を直接追加できます。抗議があり、PHP/Zend の将来のバージョンではサポートされなくなる可能性があります。どのパラメータを参照によって渡すかを指定するには、関数宣言を使用することをお勧めします。このオプションをオフにして (XXX のすべてのランタイム環境でオフになっている off を使用して) スクリプトが引き続き適切に動作することを確認し、言語の将来のバージョンでも動作することを確認することをお勧めします。

5.3 変数の入出力
XXX 環境では、GET または POST メソッドを通じて Web から渡されるパラメータに対して厳密なフィルタリングと正当性の検証が必要です。$_GET、$ を直接使用することはお勧めできません。 _POST または $_REQUEST、XXX の XXX_yiv モジュールによって提供されるメソッドを通じて取得およびフィルタリングします。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。