PHP 仕様
1. コーディング規約が必要な理由
•コーディング規約は、次の理由からプログラマーにとって特に重要です:
1. ソフトウェアのライフサイクルにおいて、80% はメンテナンスに費用がかかります。
2. ライフサイクル全体を通じて元の開発者によって保守されるソフトウェアはほとんどありません。
3. コーディング標準により、ソフトウェアの可読性が向上し、プログラマーが新しいコードをできるだけ早く徹底的に理解できるようになります。
4. ソース コードを製品としてリリースする場合は、ビルドされた他の製品と同様に、それが適切にパッケージ化され、明確であることを確認する必要があります。
2. 概要
•タブのインデントを 4 つのスペースに置き換えます。
•PHP ファイルの下部にある「?>」を削除します。
•プログラムの各行は通常 80 文字未満であり、それを超える場合は複数行で記述する必要があります。
•1 行に 1 つのステートメントのみを記述します。1 行に複数の短いステートメントを記述することはできません。
•ファイルと関数にはコメントを追加する必要があります。
•削除されたコメントコードは速やかに削除する必要があります。
•変数や関数の命名は標準化する必要があります。
3. エディターの設定
3.1. インデント
すべてのインデントにタブの代わりにスペースを使用します。 PHP ファイルでは 4 スペースのインデントが使用され、HTML ファイルと HTML ファイルに埋め込まれた Javascript コードでは 2 スペースのインデントが使用され、個々の Javascript ファイルと CSS ファイルでは 4 スペースのインデントが使用されます。
3.2. 文字エンコーディング
すべての PHP および HTML ファイルは No Bom UTF-8 文字エンコーディングとして保存されます。
4. コードのレイアウト
4.1. ファイルの下部にある「?>」を削除します。
例: 次の例は仕様を満たしていません
... // プログラムコード
}
$repssn_ni = $ssn_data[index]->ni;
ループや判定などに長い式やステートメントがある場合は、優先度の低い演算子で適切に改行し、演算子を改行の先頭に配置する必要があります。 :
コードコードcodeコードは次のとおりです。
$act_task_table[$frame_id * STAT_TASK_CHECK_NUMBER + $index]->占有
for ($i = 0, $j = 0; ($i < $bufferKeyword['word_index']->word_length)
{ … // プログラム コード
}
4.4. ステートメントは 1 つだけ記述します。 line
1 行に複数の短いステートメントを記述することはできません。つまり、1 行に 1 つのステートメントのみを記述します。例: 次の例は仕様に準拠していません
$rect->length = 0; $rect->width = 0;
$rect->length = 0;$rect->width = 0;4.5 を必ず含めます。中括弧
これは、余分な 2 文字を入力するのが面倒なために、コードの明瞭さに問題が生じるもう 1 つのケースです。
例: 次の例は仕様に準拠していません
コードをコピーします
コードは次のとおりです:
if ($condition) do_stuff();
do_stuff();
while ($condition)
if (...)
{
… // プログラムコード
}
function example_fun(){
... // プログラム コード
4.8. シンボルの間にスペースを使用する
この緩やかな方法でコードを記述する目的は、コードをより明確にすることです。
スペースを残すことで得られる明確さは相対的なものであるため、すでに非常に明確なステートメントにスペースを残す必要はありません。ステートメントが十分に明確であれば、括弧内 (つまり、左側の後に) にスペースを追加する必要はありません。括弧と右括弧の前) の場合、複数の括弧の間にスペースを追加する必要はありません。長いステートメントで多くのスペースを追加する必要がある場合は、ステートメント全体を明確にし、部分的にスペースを追加しないでください。演算子にスペースを残す場合は、連続して 2 つ以上のスペースを残さないでください。
コードは次のとおりです:
$i=($j < $size) ?0:1;
do_stuff( $i, "foo", $b );
••?> その前には必ず 1 行の空白行が必要です
•2 つの関数の間には 1 行の空白行が必要です。
•return、die、exit の前に他のステートメントがある場合は、空行を追加する必要があります。
コードの行末に余分なスペースを含めることはできません。
5. コメント
5.1. ファイルヘッダーテンプレート
/**
* ShopEx オンライン ストア ファイルの中国語名
* クラスまたはファイルの説明、ここで HTML を使用できます
*
* @package
* @version $Id$
* @copyright 2003-2008 Shanghai ShopEx Network Tech Co., Ltd.
* @license Commercial
* =========================================== = =======================
*/
5.2. 関数ヘッダーのコメント
この関数を使用するためにプログラマーに知っておくべきことを伝えるコメントが必要です。最小限のコメントには、各パラメータの意味、予期される入力、関数の出力を含める必要があります。コメントでは、エラー条件下での関数の動作 (具体的にはエラー条件とは何か) についても説明する必要があります。 (コメントは、他の人が関数のコードを見なくても、自信を持って自分のコードでこの関数を呼び出すことができることを保証する必要があります。
また、扱いにくい、わかりにくい、または明白ではないコードにコメントを追加することは、間違いなく行うべきことです。ドキュメントで特に重要なのは、コードが行う前提条件、またはコードが正しく機能するための前提条件です。すべての開発者は、アプリケーションのどの部分を見ても、妥当な時間内に何が起こっているのかを判断できる必要があります。
コードは次のとおりです:
// アクティブな統計タスク番号
Define(‘MAX_ACT_TASK_NUMBER’,1000)
// レプリケートサブシステムインデックスとネットインジケーターを取得します
$repssn_ind = $ssn_data[$index]->repssn_index;
5.8. コメントのインデント
コメントは、記述内容と同じようにインデントする必要があります。これにより、プログラムのレイアウトが整い、コメントが読みやすくなり、理解しやすくなります。
例: 次の例は仕様に準拠していません
CodeBlock Two
}
CodeBlock Two
}
program code two
例: 代 コードをコピーします
コードをコピーします
6. 命名規則
6.1. ピンイン命名法の禁止
コード内でのピンイン命名法は禁止されています。
6.2. 変数の名前付け
変数名はすべて小文字にする必要があり、単語は 1 つのアンダースコアで区切る必要があります。
例: $current_user は正しいですが、$currentuser と $currentUser は正しくありません。
名前は説明的かつ簡潔である必要があります。もちろん、変数名として長い文を使用することは望ましくありませんが、変数が何に使われるかを考えるよりも、もう少し多くの文字を入力する方が良いでしょう。
6.3. 関数の名前付け
単語の間に単一のアンダースコアで区切られた小文字の名前を使用し、動詞と目的語の句で特定の操作を実行する関数に名前を付けることができます。 OOP メソッドの場合、動詞のみにすることができます (名詞はオブジェクト自体です)。テーブル関数の名前付けを許可します。
例:
関数 print_record($rec_ind)
関数 input_record()
関数 get_current_color()
関数 is_boy()
カップリング リスト: is has
プライベート メソッドの場合、_ で始まります。
6.4. ループカウンター
単一文字の変数名が許可されるのは、ループカウンターとして使用される場合のみです。この場合、外側のループのカウンターは常に $i でなければなりません。このループ内にループがあった場合、そのカウンターは $j になり、次に $k になります。ループのカウンターが意味のある名前を持つ既存の変数である場合、この仕様は適用されません。
例:
7.1. 演算子の優先順位
演算子の優先順位に注意し、デフォルトの優先順位の使用を避けるために括弧を使用して式の演算順序を明確にしてください。プログラムを読む際の誤解を防ぎ、デフォルトの優先順位が設計思想と一致しないことによるプログラムのエラーを防ぎます。
例: 次のステートメントの式
例: 次のプログラムは読みにくいです。
コードをコピーします
if ($trunk[$index]->trunk_state == TRUNK_IDLE){
$trunk[$index]->trunk_state = TRUNK_BUSY;
... // プログラムコード
}
8. 関数
8.1. インターフェース関数パラメータの正当性チェック 関数パラメータの正当性チェックは、関数の呼び出し元の責任で行う必要があります (必須ではありません)。
8.2. 関数のサイズ
関数のサイズは、コメントと空白行を除いて 100 行に制限されています。
8.4. 多目的かつ包括的な関数を設計しないでください
複数の関数を統合する関数は、関数の理解、テスト、保守が困難になる可能性があります
複数のコードが同じことを繰り返す場合、機能の分割に問題がある可能性があります。このコード内のステートメント間に実質的な関係があり、それらが同じ機能を完了する場合は、このコードを新しい関数に構築することを検討できます。
9. 品質保証
9.1. 互換性9.2. 三項演算子、コード行では 1 つのレベルのみが許可されます
三項演算子は、単純なことを行う場合にのみ使用してください。これらは代入にのみ適しており、関数呼び出しや複雑なものにはまったく適していません。誤って使用すると読みやすさに影響を与える可能性があるため、入力を減らすためにこれらを使用することに固執しないでください。
例: 使用すべきでない場合
(($i < $size) && ($j > $size)) ? do_stuff($foo) : do_stuff($bar);
例: 使用する適切な場所 $min = ($i < $j) $i : $j;
9.3. 変数の初期化
変数は使用前に初期化する必要があり、E_NOTICE に error_reporting が追加されます。これは、変数が初期化されていない場合、エラーが報告されることを意味します。この問題は、HTML フォームで渡される変数を確認するときに最もよく発生します。これらのエラーは、組み込みの isset() 関数または empty() 関数を使用して変数が設定されているかどうかを確認することで回避できます。
例: 古い方法
新しい方法: if (!empty($forum)) ...
if (isset($forum)) ...
9.4. PHP で文字列を引用するには、一重引用符を使用する方法と二重引用符を使用する方法の 2 つがあります。主な違いは、パーサーは二重引用符で囲まれた文字列では変数置換を実行しますが、一重引用符で囲まれた文字列では変数置換を実行しないことです。したがって、実際に文字列に対して変数置換を実行する必要がない限り、常に一重引用符を使用する必要があります。こうすることで、置換を実行する必要のない大量の文字列をパーサーに解析させる煩わしさを回避できます。同様に、関数呼び出しの一部として文字列変数を使用する場合、その変数を引用符で囲む必要はありません。繰り返しますが、これはパーサーに不必要な作業を追加するだけです。いずれにせよ、二重引用符で囲まれたほとんどすべてのエスケープ シーケンスは一重引用符では機能しないことに注意してください。この規則によりコードが読みにくくなる場合は、注意して自由にコードを破ってください。
例: 次の例は仕様に準拠していません
コードをコピーします
9.5. 連想配列のキー名
PHPでは連想配列のキー名として引用符のない文字列を使用することができます。これは望ましくありません。混乱を避けるために、文字列を引用符で囲む必要があります。これは文字列を使用する場合にのみ当てはまり、変数を使用する場合には当てはまらないことに注意してください。例: 次の例は仕様に準拠していません
$foo = $assoc_array[blah];
は次のように記述する必要があります:
$foo = $assoc_array['blah'];
9.6. 演算子の簡略化
可読性の問題を引き起こす簡略化演算子は、簡略化されたインクリメント ($i++) およびデクリメント ($i--) 演算子だけです。これらの演算子は式の一部として使用しないでください。ただし、独自の回線でも使用できます。式の中でこれらを使用するだけでは、デバッグの悩みを解決するのに十分ではありません。
例: 次の例は仕様に準拠していません
9.9. require と include
プログラム内でインクルード ファイルを使用する必要がある場合、require_once または include_once を使用する必要があり、require または include は許可されません。
9.10. ファイル名
ファイル名はすべて小文字にし、単語を 1 つのアンダースコアで区切る必要があります。
名前は説明的かつ簡潔である必要があります。もちろん、長い文章をファイル名として使用することは望ましくありませんが、何のためのファイルなのかを考えるよりも、もう少し多くの文字を入力する方が良いでしょう。
10. SQL 構文
10.1. SQL コードのレイアウト私たちは皆異なるエディター設定を使用しているため、SQL コードで列の配置などの面倒なことをしようとしないでください。どのような方法を使用する場合でも、ステートメントをそれぞれの行に分割します。 SQL コードがどのようになるかの例を次に示します。改行、大文字の使用、括弧の使用に注意してください。
10.3. SQL select ステートメント
クエリ対象のフィールドが既知であることを前提として、次のコードは許可されません:
SELECT * FROM `mytable`
代わりに、各フィールド名を書き込むこともできます。怠惰にしないでください。 SELECTcol1,col2,col3 FROM `mytable`
既知の数のレコードを取得する必要がある場合は、LIMIT オフセット、カウントを使用し、LIMIT なしで SELECT ステートメントを使用しないようにしてください。
レコード数が必要な場合や条件を満たす場合は、SELECT count([*|col1]) FROMを使用し、SELECT col1 FROMは使用しないようにしてください。
論理演算を実行する必要がある場合は、「等しくない」を使用しないでください。「以上」または「以下」を使用できます。
10.4. SQL 挿入ステートメント
SQL INSERT ステートメントは 2 つの異なる方法で記述できます。挿入する列を明示的に指定するか、データ内の列の順序がすでに分かっており、詳細に指定する必要がありません。ここでは、挿入する列を指定する前者のアプローチを使用したいと考えています。これは、アプリケーション コードがデータベース内のフィールドの順序に依存せず、フィールドを追加してもクラッシュしないことを意味します (もちろん、フィールドが NOT NULL として指定されている場合を除く)。
例:
# これは私たちが望むものではありません
11.2. 二重引用符、一重引用符
Dreamweaver が Smarty ステートメント内の二重引用符を " に書き換えないようにするには、Smarty 中括弧内では二重引用符を使用できませんが、一重引用符を使用する必要があります。
間違った書き方:
<{if $user_name eq ""}>匿名ユーザー<{/if}>
<{insert name=”query_info”}>
正しい書き方:
< { if $user_name eq ''}>匿名ユーザー<{/if}>
<{insert name='query_info'}>
11.3. HTML 属性値を条件付きで設定する必要がある場合テンプレート内で HTML 要素の属性値を設定する場合、すべてのステートメントを二重引用符で囲む必要があります。間違ったコード:
つまり、eq、gt などの条件修飾子を使用し、== や > を直接使用することは避けてください。