内部用Drupal/PHP开发轨范1.2

Jun 13, 2016 am 10:49 AM
drupal gt lt nbsp php

内部用Drupal/PHP开发规范1.2
前言
常言道,“没有规矩,不成方圆”。良好的编程风格与规范对开发者以及项目管理人员都是非常重要的。
当一个软件项目尝试着遵守公共一致的标准时,可以使参与项目的开发人员更容易了解项目中的代码、弄清程序的状况。使新的参与者可以很快的适应环境,防止部分参与者出于节省时间的需要,自创一套风格并养成终生的习惯,导致其它人在阅读时浪费过多的时间和精力。而且在一致的环境下,也可以减少编码出错的机会。缺陷是由于每个人的标准不同,所以需要一段时间来适应和改变自己的编码风格,暂时性的降底了工作效率。从使项目长远健康的发展以及后期更高的团队工作效率来考虑暂时的工作效率降低是值得的,也是必须要经过的一个过程。标准不是项目成功的关键,但可以帮助我们在团队协作中有更高的效率并且更加顺利的完成既定的任务。

第1章、排版规则

1.1、缩进
代码缩进使用2个空格,而不是tab键,因为在不同的编辑器查看代码时,tab键的显示出来的长度根是不一样的,虽然空格会增加文件的大小,这些误差是微不足道的。
在很多编辑器中,都可以设置将tab键设置为2个空格,如果你习惯使用tab键的话。

1.2、空格规则
空格应该在以下情况下使用:

   1. 关键字与(之间应该有1个空格,例:
              while ($user->uid > 0) {
      ?>
   2. 函数名和(之间不应该有空格,例:
              function arg() {
      ?>
   3. 一元操作符与其操作数之间不应该有空格,除非操作数是个单词,例:typeof。
   4. 每个在控制部分,例for语句中,“;”后必须跟一个空格。
   5. 每个,后应跟一个空格。

1.2.1、逻辑运算符前后都必须加空格,加一减一运算除外
  // 正确
  $a == $b;
  // 错误
  $a==$b;
  $a ==$b;
  // 正确
  $a++;
  $a--;
  // 错误
  $a ++;
  $a --;
?>



1.2.2、多个参数分隔时必须加空格
// 正确
  $a, $ab, $c;
  arg($a, $b, $c);
  // 错误
  $a,$ab,$c;
  arg($a,$b,$c);
?>



1.2.3、语法关键字后必须加空格
if, for, while, switch等关键字。
例:
  // 正确
  for ($a = 0;$   // 错误
  for($a = 0;$ ?>



1.3、字符串和变量的连接规则
字符串与变量连接使用“.”,且在“.”左右都有1个空格,使用"自动转义变量时必须在变量前后加“{}”
// 正确
  $result = 'file_' . $var;
  $result = 'file_{var}';
  // 错误
  $result = 'file_'.$var;
  $result = 'file_$var';
?>



1.4、每行一个语句,除非这些语句有很密切的联系,否则每行只写一个语句。用空行来将逻辑相关的语句分隔开以提高程序的可读性。
正确
  $node_types = node_get_types('types', NULL, TRUE);

  foreach ($node_types as $type => $info) {
    //
  }
?>


错误
  $node_types = node_get_types('types', NULL, TRUE);
  foreach ($node_types as $type => $info) {
    //
  }
?>



1.5、关键字
if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要有完整的括号{}
例:
正确
  if (NULL == $arg) {
    return;
  }
?>


错误
  if (NULL == $arg) return;
?>



1.5.1、if
格式如下:
  if (condition) {
    //
  }

  if (condition) {
    //
  } else {
  
  }

  if (condition) {
    //
  } else {
    //
  }
?>



1.5.2、for
格式如下:
  for ($i = 0; $i     //
  }
?>



1.5.3、do
格式如下:
不像其他复合语句,do语句总是以“;”结束。
  do {
    //
  } while (condition);
?>



1.5.4、do
格式如下:
  switch (expression) {
    case expression:
      statements;
    default:
      statements;
  }
?>


每一组statements(除了default,应以break、return或者throw结尾。不要让它顺次往下执行。)



1.5.5、try
格式如下:
  try {
    statements
  } catch (variable) {
    statements
  }
?>



1.6、数据库

    * 查询语句中关键字部分应该大写。

第2章、命名规范
命名统一遵守Linux C命名规范,包括PHP、XHTML、CSS、JS。
变量名所有字母都小写,使用“_”作为每个词的分界(CSS中使用“-”,因为很多drupal生成的代码都用“-”(例如区块ID,通常为类似#block-vacation)。),变量名必须有一定的意义,使程序一目了然。
在项目中,相同意义的变量变量名应该尽量相同,例:drupal项目中$node表示节点,节点在很多地方都使用到,如果命名相同,一眼就可知道这是个节点,可以使用节点的相关函数操作,如要区分多个节点,则可以加上有意义的字母在前,例:$book_node、$color_node。

2.1、常量
PHP的常量应该全部使用大写字母,并使用_来正确的分隔字词。
常量使用模块名来作为前缀,这样个可以避免常用字词的冲突。例:你的模块名为test.module,那么常量名字应该如例TEST_USER。
  define('TEST_CONFIRM_UID', 0);
?>



2.2、全局变量
全局变量命名规则:$_模块名(主题名)_全局变量名
例:
  // 错误
  globe $records;
  // 正确
  globe $_test_records;
?>



2.3、静态变量
静态变量使用前缀s,例:
  $s_records;
?>



2.4、临时变量
不要将在循环中频繁使用的临时变量如$i、$j等用于其他用途。

2.5、函数命名
函数名采用C GUN的惯例,所有字母使用小写字母,规则:模块名+_+函数名,要注意的是命名时不要与drupal的相关hook重名。

2.6、文件名命名
文件名应该都是小写的。例外情况就是文档文件,它们全部大写并且类型为txt文件。
例如:
LICENSE.txt
README.txt
INSTALL.txt

第3章、编程规范
系统统一使用时间戳time()作为时间标志,存入mysql时使用INT(10)类型写入。
引号使用单引号,只有当引号重叠时才使用双引号,这样每进程可以省几百K内存。
统一使用
?>,禁止使用
?>



3.1、数组定义规则
key、值必须使用单/双引号。
  // 正确
  array(
    'name' => 'myname',
    'type' => 'mytype'
  );
  // 错误
  array(
    name => myname,
    type => mytype
  );
?>



3.2、不采用缺省方式测试变量/函数
  // 正确
  if ($user > 0) {
    //
  }

  if (arg(1) != '') {
    //
  }
  // 错误
  if ($user) {
    //
  }

  if (arg(1)) {
    //
  }
?>



3.3、文件结构规则
drupal模块开发规则如下(以模块名为book为例):
主模块(book.module)包含 hook_help()、hook_init()、hook_menu()以及该模块的一些共用函数,如需要调用其他模块的函数(必须启用的核心模块除外),应先判断该模块是否开启(例:module_exists('book');)。
book.admin.inc(管理页面相关代码)、book.page.inc(用户操作所用代码),应该归类放置,使用hook_menu中“file”键指向。
模块中使用到的一些js插件,如jquery插件,应放在模块目录中js文件夹中。

3.4、数据库操作规则

    * 查询1条以及多条记录时,使用db_query_range()。
    * 每次查询如果可以都应该加上ORDER针对INDEX排序。

3.5、注释
注释文档遵循Doxygen注释样式,注释块语法如下(包括css、js):
  /**
   * Implementation of hook_cron().
   */
  function node_cron() {
    db_query('DELETE FROM {history} WHERE timestamp   }
?>


注释块必须紧挨着放在函数前,中间不存在空行。
drupal能够理解下面所列的Doxygen构造体,具体构造体作用请参照Doxygen文档:



    * @mainpage
    * @file
    * @defgroup
    * @ingroup
    * @addtogroup
    * @param
    * @return
    * @link
    * @see
    * @{
    * @}

3.5.1、// $id$
“// $id$”用于追踪版本号以及最后修改的用户,以注释方式放在每个文件最前头(包括js、css等所有需要提交到版本库的文件)。当把代码提交到CVS(SVN),系统将会自动对这一标签进行解析和扩展,变成如下:
// $Id: node.module,v 1.947.2.29 2010/12/15 12:53:33 goba Exp $
?>



第4章、编写安全的代码
4.1、处理用户输入输出
非drupal hook_form生成的表单(包括一些ajax)提交上的数据,应该进行安全过滤。以下列出drupal提供的一些过滤函数。

    * check_plain(HTML),转换为纯文本,将特定字符转换为HTML实体。
    * filter_xss(HTML),使用一组标签,检查和清理HTML
    * check_markup(HTML),使用过滤器(可以自定义)过滤
    * drupal_urlencode(URL),将特定字符编码为%0x
    * check_url(URL),清理url中有害协议,例如javascript:runevilJS()

通常在输出中,应该用t()函数,来过滤输出,以便支持drupal的多语言模块。
4.2、处理mysql语句
进行数据库的增删查改操作时,都要使用db_query()函数(drupal7使用方法有变动,具体请参照相关资料),表名必须使用大括号,这样在有数据库前缀的时候,可以自动判断。如下:
  /**
   * Implementation of hook_cron().
   */
  function node_cron() {
    db_query('DELETE FROM {history} WHERE timestamp   }
?>



4.2.1、使用db_rewrite_sql()来保持私有数据的私有性
如果启用了节点访问模块对节点访问进行了权限控制,那么直接通过db_query()查出的数据是无法进行权限过滤的,这时候,需要用到db_rewrite_sql(),在一些节点数据的操作上,如果mysql语句没处理到权限部分,则必须使用该函数。例:
  $result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.status = 1 AND (r.rid IN (". db_placeholders($rids) .") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array($theme_key), $rids));
?>



第5章、其他重要杂项

    * 不到万不得已,不修改drupal核心代码,如有修改,应在开发文档中有记录。
    * 模块中HTML展示部分尽量都使用默认风格,例、table(theme('table', $header, $rows))、list(theme('item_list', $items))等,如特殊风格部分,HTML、CSS都应该写在模块中,而不是依赖主题,这样,在主题的切换中,就不会导致无法使用。
    * 所有的链接都必须使用l()函数,该函数会自动判断网站根目录位置,避免在网站迁移后有死链接。
    * 访问权限控制尽量捆绑在hook_menu上,不应该在函数内有过多的判断。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles