- A+
使用微擎做二次开发贡献自己的代码,需要仔细阅读PHP编码规范,本代码规范旨在帮助开发者养成良好一致的编程风格,转自微擎官网,微擎TECH分享:
以下是有关微擎开发的PHP编码规范与原则,包括:
一:文件编码及编辑器格式
二:书写规则
三:函数定义
四:引号
五:数据库操作
六:命名原则
七:封装
八:封装时机
九:参数传递
十:变量的初始化与逻辑检查
十一:安全性
十二:其他细节问题
十三:其他注意要点
一:文件编码及编辑器格式
请在开始编辑微擎代码之前调整你的编辑器设置。
本条规范同样适用于 PHP、HTML、CSS、JavaScript
编码
请调整您的编辑器文件编码为 UTF-8,并关闭 UTF-8 BOM((Byte Order Mark))的功能。我们要求使用 Eclipse、ZendStudio、PHPStome 等集成化的IDE。切记请不要使用windows自带的记事本编辑项目文件。
注意:请确认你的编辑器不会有意或无意的保存文件为 UTF-8 BOM 格式, 否则可能造成微擎系统通信不正常。
缩进
每个缩进的单位约定是一个Tab(禁止设置为空格替代,Tab宽度应表示为4个空白字符宽度),需每个参与项目的开发人员在编辑器(UltraEdit、EditPlus、Zend Studio等)中进行强制设定,以防在编写代码时遗忘而造成格式上的不规范。
换行
微擎项目中使用Unix风格的换行符,即只有换行( LF 或 “\n” )没有回车( CR 或 “\r” ),请在你的编辑器内调整
代码标记
PHP程序需使用 来界定 PHP 代码,在HTML页面中嵌入纯变量时,可以使用 这样的形式。
注意:为了使代码规范化和标准化,微擎开发中禁止使用 ?> 和 =$variablename?> 这种速记形式。
注释
注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用“/* */”和“//”。
尽量使用变量名,整体逻辑结构来表达程序中的意图,对于特别难懂的逻辑或是算法可以添加注释以便于其他人员更方便理解意图,注释应该是解释 “为什么这么做” 而不是 “这是什么东西” 。
代码中不得包含任何调试性的代码(注释后也不可以),如果有一些未完成或是待完善的功能必须添加统一的注释标记“//debug”并后跟完整的注释信息
例如:
/** * 多行注释请用这种格式 * @param string $acid 微信公众号的acid * @return array */ $num = 1; $flag = TRUE; //debug 这里不能确定是否需要对$flag进行赋值 if(empty($flag)) { //Statements }
二:书写规则
大括号{}、if和switch
以下是符合上述规范的例子:
if ($condition) { //Statements } else { switch ($str) { case 'abc': $result = 'abc'; break; default: $result = 'unknown'; break; } }
运算符、小括号、空格、关键词和函数
根据上述原则,以下举例说明正确的书写格式:
$result = (($a + 1) * 3 / 2 + $num)) . 'Test'; $condition ? func1($var) : func2($var); $condition ? $long_statement : $another_long_statement; if ($flag) { //Statements //More than 15 lines } showmessage('请使用 restore.php 工具恢复数据。');
三:函数定义
例如,符合标准的定义:
function message($string, $operation, $key = '') { if ($flag) { //Statement } //函数体 }
不符合标准的定义:
function authcode($string,$operation,$key = '') { //函数体 }
四:引号
由于PHP中单引号和双引号具有不同的含义,因此在使用时有如下原则:
$sql = "UPDATE " . tablename('members') . " SET adminid='1' WHERE AND adminid='2'";
五:数据库操作
为保证数据操作安全,数据库操作有以下处理及书写原则:
这是一个完整的数据库操作示例:
//pdo_getXXX 系列函数,推荐使用 $trades = pdo_getall('trades', array('username' => $_GPC['username'], 'tid' => $_GPC['select'])); //直接书写SQL,需要自行处理参数转义等问题 $tids = array(); if(!empty($_GPC['select'])) { foreach($_GPC['select'] as $t) { $tids[] = intval($t); //---- 必须将输入参数转换为无安全隐患的格式,数字列必须转换为数字列,字符串列必须使用 addslashes } } if(!empty($tids)) { $sql = 'SELECT * FROM ' . tablename('trades') . ' WHERE `username`=:username AND `tid` IN (' . implode($tids) . ')'; $pars = array(); $pars[':username'] = $_GPC['username']; $trades = pdo_fetchall($sql, $pars); }
六:命名原则
命名是程序规划的核心。古人相信只要知道一个人真正的名字就会获得凌驾于那个人之上的不可思议的力量。只要你给事物想到正确的名字,就会给你以及后来的人带来比代码更强的力量。
名字就是事物在它所处的生态环境中一个长久而深远的结果。总的来说,只有了解系统的程序员才能为系统取出最合适的名字。如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。
就一般约定而言,类、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。形式越简单、越有规则,就越容易让人感知和理解。应该避免使用模棱两可,晦涩不标准的命名。
变量、函数名
变量名命名方式
变量名要完全、准确地描述出该变量所代表的事物。这种名字很容易阅读,没有晦涩的缩写,同时也没有歧义。
一个好记的名字反映的通常都是问题,而不是解决方案。一个好的名字通常表达的是“什么”,而不是“如何”。
比如:文章推荐列表应该命名成 $article_recommend_list 而且 $data_list
单词分隔
循环中变量定义
循环内的局部变量也应该避免使用无意义的$i、$j等变量,比如循环商品 $goods as $i => $goods_row,如果键值不是存放着自增索引,也可以使用 $goods as $goods_id => $goods_row,比如循环文件 $files as $i => $filename。
常用缩写列表
除下方列表外,一切缩写皆不可使用
类和接口名
class Loader { function func($function_name) { } function fileCache() { } }
JavaScript代码
常量
常量是增强代码语义重要的一个手段,大多数我们在保存类型或是其它数据时会采用Int数字来表示,这些数字是没有意义的,这时候我们可以用常量的方式来处理这些数据。
七:封装
封装功能并不是简单的把代码复制到函数里,要进行功能的抽象和拆解,比如:上传微信图文素材和本地图文素材转换成微信素材,这两个功能中“将某些数据保存至微信”是他们两个共有的功能,则会封装 “material_local_news_upload()”,封装的时候,尽量的不太过多的参与到业务中,外部是负责把数据结构拼接好,函数内部只要处理自己的功能就好,而且要遵循“单一原则”规则。写好函数后,自己思考一下,这个函数如果脱离这个业务是否还可以在其它地方使用?
八:封装时机
获取整体信息时
获取目标对象的信息时,一定要考虑是否还关联着其它信息。比如获取公众号时,公众号除主体信息外,还会关联着可用模块、所有者、权限等数据,在获取时应该一并获取出来。
重复使用的代码
如果相同的代码在不同位置出现两次及以上,就要考虑封装。封装时要把公共的功能抽象出来进行封装,而不是单纯的复制+粘帖。比如:切换公众号和切换小程序,会将“uni_account_save_switch()”和 “uni_account_last_switch()”进行封装
晦涩难理解的代码
在写代码时提倡优雅的书写代码,实现功能。但是某些时候可能还是会有一些难以理解的代码,就要考虑封装,封装时一定要注意函数的命名。
大段的功能操作
一个功能如果需要大量的代码,比如添加公众号,需要先处理主体信息,还要根据不同的类型处理不同的表,还要处理用户权限,模块等等,此时就要考虑封装。
其它功能可能会用到
功能相互间不可能是独立的,总是会在一些功能里用到额外的一些功能或是数据。我们在书写功能时,要长远的考虑一下,比如一些基本信息,基本的操作外部可能会调用,就要考虑封装。比如,会员数据的获取,更新等等
九:参数传递
无论是在功能函数中还是控制中,我们都需要接收外部传来的某一些参数来实现功能,我们可以理解成这些参数是我们内部提供给外部的一些访问接口。
外部提供过来的数据是不可靠也不可信的,外部过来的数据我们必须要进行验证,传递的数据越多,要验证的数据就越多,代码也就越复杂。
通常我们要尽量减少外部传递的参数,以最小设计(最小传递)来做,能传一个不传两个,更多的值通过内部来获取
十:变量的初始化与逻辑检查
任何变量在进行累加、直接显示或存储前必需进行初使化,例如:
$number = 0; // 数值型初始化 $string = ''; // 字符串初始化 $array = array(); // 数组初始化
十一:安全性
PHP中的变量不并不像C语言那样需要事先声明,解释器会在第一次使用时自动创建他们,同样类型也不需要指定,解释器会根据上下文环境自动确定。从开发人员的角度来看,这无疑是一种极其方便的处理方法。
一个变量被创建了,就可以在程序中的任何地方使用。这导致的结果就是开发人员工经常不注意初始化变量。因此,为了提高程序的安全性,我们不能相信任何没有明确定义的变量。所有的变量在定义使用前要初使化以防止恶意构造提交的变量覆盖程序中使用的变量。
不要相信任何客户端提交的数据是安全的。(包括:$_GET、$_POST、$_COOKIE、$_FILES、$_SERVER、$_REQUEST),获取数据时必须使用安全相关函数获取值。
十二:其他细节问题
代码结构
微擎中每个文件的结构如下,必须严格按照此规范
<?php /** * 当前文件功能说明 * [WeEngine System] Copyright (c) 2013 - 2017 WE7.CC */ define('IN_SYS', true); //入口常量定义 require '../framework/bootstrap.inc.php'; //加载引导文件 require IA_ROOT . '/web/common/bootstrap.sys.inc.php'; load()->web('common'); //各种载加函数 load()->func('communication'); load()->model('cloud'); load()->classs('coupon'); $dos = array('post', 'delete', 'display'); //文件中操作访问控制 $do = in_array($do, $dos) ? $do : 'post'; $_W['page']['title'] = '页面标题'; //页面标题及一些公共代码 $id = intval($_GPC['id']); if ($do == 'post') { //各分支代码 } elseif ($do == 'delete') { }
十三:其他注意要点
2023腾讯云服务器超便宜,这个价格太可以了,抓紧上车!
- 2核2G3M服务器30元/3个月:点此直达
- 2核2G3M服务器95元一年:点此直达
- 2核2G4M服务器112元/1年:点此直达
- 2核2G4M服务器396元/1年:点此直达
- 2核4G5M服务器168元/3年:点此直达
- 2核4G5M服务器628元/3年:点此直达
- 4核8G12M服务器446元/1年 518元15个月:点此直达
- 8核16G18M服务器1668元/15个月
- 16核32G28M服务器3468元/15个月
注意:以上特价轻量服务器限制条件为“产品首单特惠”,如果你的腾讯云账号已经是老用户,建议重新注册一个腾讯云账号,如果你是新用户符合条件,那么无脑入,这个CPU内存带宽配置,价格确实便宜,值得买!
2023服务器价格出炉,便宜有好货!
优惠:阿里云服务器拼团直达(价格便宜,不用拉人)
①阿里云:阿里云服务器69元一年,209元三年(很便宜)
②代金券:阿里云代金券限量发放中...(有账号就能领)
③腾讯云:腾讯云服务器秒杀特价88元/年起(有高配)