概述
仔细的缕了一下关于PHP代码的书写规范,我发现我确实有很多不足的地方,需要改进,PHP代码遵循PSR(PHP Standard Recommendation)规范,之前忘了看那本书到psr4,psr4优化的是composer的依赖倒置,现在已经到psr18了,官网链接 php-fig 。
代码写的很随意,显得自己不专业,也给别人的阅读带来不便。
1.变量、函数写法驼峰(我之前的代码里就是变量有下划线、有驼峰非常不标准)
代码语言:txt复制public function readMessage()
{
$fdServer = new FdServer();
$countServer = new CountServer();
$toUid = $this->request->getToUid($this->body['to_uid']);
$syncStamp = $this->request->getSyncStamp($this->body['syncstamp']);
##略
}
2.如果只是当前类使用,不涉及外面的类调用,控制权限给private,方法名用下划线,如果返回数据,返回数据类型最好也保持统一。
代码语言:txt复制private function _formatData($data)
{
if(!$data) return [];
foreach ($data as $val){
//...略
}
return $data;
}
3.if条件和嵌套,个人习惯如果是if最好是加上{},也有人习惯不加,没有权威手册说加好还是不加好。
代码语言:txt复制function getPayAmount() {
let result;
if (isDead)
result = deadAmount();
else {
if (isSeparated)
result = separatedAmount();
else {
if (isRetired)
result = retiredAmount();
else
result = normalPayAmount();
}
}
return result;
}
优化后,是不是清爽了太多。
代码语言:txt复制function getPayAmount() {
if (isDead) return deadAmount();
if (isSeparated) return separatedAmount();
if (isRetired) return retiredAmount();
return normalPayAmount();
}
4.重复2次的地方,要写一个函数处理,写函数处理代码的好处是修改时可以统一修改,方便调用,而且在性能上也更优,PHP的底层调用函数结束后,释放资源,如果不分离代码,需等待全部程序执行完毕在统一释放。
5.ORM层数据库的链式调用,ORM主要是采用面向对象的思想对数据库进行操作。
代码语言:txt复制Model::create()->where('status', 1)->where(' (id > 10 or id <2) ')->get();
底下的链式对Sql执行进行了预处理,防止Sql注入:
代码语言:txt复制public function getNovelApplyCount(int $nid)
{
$sql = "SELECT COUNT(*) number FROM {$this->table}
WHERE `novel_id` = :novel_id";
$data = [
':novel_id' => $nid,
];
$tag = $this->getNovelTag($nid);
$res = $this->dao->conn(false)->setTag($tag)->preparedSql($sql, $data)->fetchOne();
return $res['number'] ?? 0;
}
6.PHP5到PHP7的变化
PHP5最重要的特性就是丰富了面向对象的设计和语法,PHP7最大的特性就是提升了性能,PHP7还有个小细节是弱类型语法像强类型语法转变的风格,参数做了很大的限制。
我个人猜想可能是限制了数据类型,考虑的是性能的提升,底层少了一层类型转化。
代码语言:txt复制protected function onRequest(?string $action): ?bool
{
//接收参数
$this->params = $this->request()->getRequestParam();
$this->method = $this->request()->getMethod();
return true;
}
private static function _formatQueryData(string $loginKey): string
{
$data['timestamp'] = time();
$data['loginKey'] = $loginKey;
$token = self::setToken($data);
$data['token'] = $token;
$params = http_build_query($data);
return $params;
}
7.代码列 最好不要超过 120,单个函数 不要超过 100 行(psr2原文)
代码语言:txt复制There MUST NOT be a hard limit on line length.
The soft limit on line length MUST be 120 characters; automated style checkers MUST warn but MUST NOT error at the soft limit.
Lines SHOULD NOT be longer than 80 characters; lines longer than that SHOULD be split into multiple subsequent lines of no more than 80 characters each.
There MUST NOT be trailing whitespace at the end of non-blank lines.
Blank lines MAY be added to improve readability and to indicate related blocks of code.
There MUST NOT be more than one statement per line.
8.psr14的主题是Event Dispatcher,大概就是把定义的对象写在调用函数里。
代码语言:txt复制class WebSocketEvent
{
const MYSQL_CONN_NAME = 'mysql-msg';
/**
* @param SwooleHttpRequest $request
* @param SwooleHttpResponse $response
* @return bool
*/
public function onHandShake(SwooleHttpRequest $request, SwooleHttpResponse $response)
{
/** 此处自定义握手规则 返回 false 时中止握手 */
if (!$this->customHandShake($request, $response)) {
$response->end();
return false;
}
/** 此处是 RFC规范中的WebSocket握手验证过程 必须执行 否则无法正确握手 */
if ($this->secWebsocketAccept($request, $response)) {
$response->end();
return true;
}
$response->end();
return false;
}
}
9.代码分层。
就像Tcp/Ip协议一样,复杂的处理过程就是进行人为的逻辑分层,PHP的分层有之前的MVC和现在流行的DDD模式,有人说MVC是滴血模式,我个人觉得MVC也是很好用的,不能网上流行什么我们就用什么,主流的一般都是大公司的处理方式和模式,可是互联网一共有多少大公司呢,开发者要有自己的思维方式,用什么看具体的业务需要。
10.PHPstrom的设置,命名规范还有个小窍门,如果是命名不规范,PHPstrom会提示绿色波浪线,注释不规范就会提示黄色波浪线,下面是不规则的Demo。
Mac格式化代码:shift alt command l