最新消息:

干货:PHP代码规范

PHP guangzhouzhongxing 97浏览 0评论

其实对于PHPer来说,这些思想在处理具体业务来说有些麻烦,这也是PHP的最大优势非常的自由方便,自由简单随意的基本语法,方便的连内存资源都不用考虑,很快就可以hello一个,

但这也正是PHP一个先天的重大劣势,没有一个系统的成脉络的设计体系。PHP出生时就是一个单一的满足业务的语言,并没有像JAVA一样有很系统设计体系和原则。在JAVA有三个最基础的设计原则:1,不支持全局变量。2,不写万能类。3,代码必须是类封装。

JAVA的第一个,第三个原则是在语法上就限制了,第二个原则是评判一个JAVA程序员是否入门的标准。PHP相对来说就没什么这样的语法上的设计原则限制,可接触了一些大公司,真没有体系原则呀,哎。

但在我们设计思想里可不能真的没有原则呀!

PHP程序其实是怎么方便怎么来,解释器很强大,可以屏蔽包容各种思路的程序代码,只要语法OK,不在乎代码设计。正因早期的PHP太随意了,入门很容易,不用很好的对代码进行有效的管理和方便的复用。随着PHP的发展,PHP已经告别在PHP3~PHP4时代动态标记语言,但因为向上兼容原则,PHP还是一个语法宽松的语言,系统化的程序设计原则还没有强制融入到语言核心中来。

这样并不代表我们不需要使用成熟的设计思想来完善和编写我们的程序代码。JAVA的程序设计原理和代码积累,是JAVA的精髓,随着时间的积累越发明显。将JAVA的程序设计思想,引入到PHP的编程过程中来。是一个完善PHP代码的很好的方法。

1. 代码分级封装

2. 文件灵活调用加载,资源随用随创建

3. 平整抗老化的目录结构

解决这些能为程序编写过程,带来非常多的益处。

如何解决呢?

可以通过对于MVC设计思想进行的拆解封装,来实现清晰,有效,一致性的程序设计思想。

一个程序从逻辑结构上可看做是模型(Model),视图(View)和控制Controller)三个逻辑块。

在JAVA中Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,通常是router servlet向应用端的扩展。

可 PHP 没有这样清晰的划分,所以需要将设计思想揉入到程序代码中去。

1、程序代码类封装

对于一个应用需求(ex: similar相似商品页),将需求先分为3个文件:similar.controller.php;similar.model.php.similar.view.php

通过名字我们也可以看出各文件中的代码用途,剩下就是要给各个文件中的类进行命名。

因为是这对一个应用的不同操作类,所以需要给各个类加不同的类目后缀,

例如similar.controller.php

//controller 控制程序类 完成此类中的方法是程序各页面流程,每一个方法对应一个同步请求页面(以配合页面的调用规则)

class similar{

//相似商品页的展现

functio do_opensearch($_param){

//请求参数过滤

//请求商品数据

//根据呈现规则处理商品数据

//渲染商品数据获取呈现html

//展示呈现html

}

}

对应的请求就是

http://s.etao.com/similar/opensearch/

similar.model.php

//model 数据操作程序类 完成对此应用的数据请求封装,返回结果的结构解析处理

class similarMODEL{

}

similar.view.php

//model 呈现操作程序类 完成对此应用的数据呈现封装,返回给已经处理好的

class similarVIEW{

function view_getDetail($_goodDataArr){

return $html;

}

}

7.当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。

8.使用选择分支语句(switch case)好于使用多个if,else if语句。

9.利用var_dump进行PHP代码调试。如果你在寻找php调试技术,我必须说var_dump应该是你要找的目标,在显示php信息方面这个命令可以满足你的所有需要,而调试代码的多数情况与得到PHP中的数值有关。

10.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

11.动辄创建全局数值是一种糟糕的做法,不过有时候实际情况的确又需要这么做。对于数据库表或数据库连接信息使用全局数值是一个不错的想法,但不要在你的PHP代码中频繁使用全局数值。另外,更好的一种做法是把你的全局变量存放在一个config.php文件中。

12.如果你想知道脚本开始执行的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

13.打开apache的mod_deflate模块。

14.用@屏蔽错误消息的做法非常低效。

15.尽量采用大量的PHP内置函数。

16.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

17.派生类中的方法运行起来要快于在基类中定义的同样的方法。

18.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)

19.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

20.正如之前提到的,任何php网站中最重要的部分有99%的可能是数据库。因此,你需要非常熟悉如何正确的使用sql,学会关联表和更多高级的数据库技术。

除此之外,

开源世界里有很多不错的发布代码工具,比如 ruby 社区的 capistrano,其流程大致就是发布代码到一个全新的目录,然后再软链接到真正的发布目录。

.

不过鉴于 PHP 本身的特殊性,如果只是简单套用上面的流程,那么将很难实现真正的原子发布。要理清个中缘由,还需要了解一下 PHP 中的两个 Cache 的概念:

opcode cache

realpath cache

先聊聊 opcode cache,基本就是 apc 或者 zend opcode,关于它的作用,大家都已经很熟悉,不必多言,需要注意的是 apc 的 bug 很多,比如开启了 apc.enable_cli 配置后就会有很多灵异问题,所以说 opcode cache 还是尽可能使用 zend opcache 吧,如果需要缓存数据,可以用apcu。此外 apc 和 zend opcode 对缓存键的选择有所差异:apc 选择的是文件的 inode,zend opcode 选择的是文件的 path。

再聊聊 realpath cache,它的作用是缓冲获取文件信息的 IO 操作,大多数时候它对我们而言是透明的,以至于很多人都不知道它的存在,需要注意的是 realpath cache 是进程级别的,也就是说,每一个 php-fpm 进程都有自己独立的 realpath cache。

假设在发布代码期间,opcode cache 或者 realpath cache 里的数据出现过期,那么就会出现一部分缓存是旧文件,一部分缓存是新文件的非原子发布的情况,为了避免出现这种情况,我们应该保证缓存过期时间足够长,最 好是除非我们手动刷新,否则永远不过期,对应到配置上就是:关闭 apc.stat、opcache.validate_timestamps 配置,设置足够大的realpath_cache_size、realpath_cache_ttl 配置,必要的监控总是有好处的。

相关的技术细节特别琐碎,建议大家仔细阅读如下资料:

realpath_cache

PHP’s OPCache extension review

Atomic deploys at Etsy

Cache invalidation for scripts in symlinked folders

干货:PHP代码规范

转载请注明:PHP学习 » 干货:PHP代码规范

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址