提高 PHP 代码质量的 36 计.docx
- 文档编号:3046839
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:20
- 大小:27.34KB
提高 PHP 代码质量的 36 计.docx
《提高 PHP 代码质量的 36 计.docx》由会员分享,可在线阅读,更多相关《提高 PHP 代码质量的 36 计.docx(20页珍藏版)》请在冰豆网上搜索。
提高PHP代码质量的36计提高PHP代码质量的36计1.不要使用相对路径常常会看到:
require_once(././lib/some_class.php);该方法有很多缺点:
它首先查找指定的php包含路径,然后查找当前目录.因此会检查过多路径.如果该脚本被另一目录的脚本包含,它的基本目录变成了另一脚本所在的目录.另一问题,当定时任务运行该脚本,它的上级目录可能就不是工作目录了.因此最佳选择是使用绝对路径:
define(ROOT,/var/www/project/);require_once(ROOT././lib/some_class.php);/restofthecode我们定义了一个绝对路径,值被写死了.我们还可以改进它.路径/var/www/project也可能会改变,那么我们每次都要改变它吗?
不是的,我们可以使用_FILE_常量,如:
/supposeyourscriptis/var/www/project/index.php/Then_FILE_willalwayshavethatfullpath.define(ROOT,pathinfo(_FILE_,PATHINFO_DIRNAME);require_once(ROOT././lib/some_class.php);/restofthecode现在,无论你移到哪个目录,如移到一个外网的服务器上,代码无须更改便可正确运行.2.不要直接使用require,include,include_once,required_once可以在脚本头部引入多个文件,像类库,工具文件和助手函数等,如:
require_once(lib/Database.php);require_once(lib/Mail.php);require_once(helpers/utitlity_functions.php);这种用法相当原始.应该更灵活点.应编写个助手函数包含文件.例如:
functionload_class($class_name)/pathtotheclassfile$path=ROOT./lib/.$class_name.php);require_once($path);load_class(Database);load_class(Mail);有什么不一样吗?
该代码更具可读性.將来你可以按需扩展该函数,如:
functionload_class($class_name)/pathtotheclassfile$path=ROOT./lib/.$class_name.php);if(file_exists($path)require_once($path);还可做得更多:
为同样文件查找多个目录能很容易的改变放置类文件的目录,无须在代码各处一一修改可使用类似的函数加载文件,如html内容.3.为应用保留调试代码在开发环境中,我们打印数据库查询语句,转存有问题的变量值,而一旦问题解决,我们注释或删除它们.然而更好的做法是保留调试代码.在开发环境中,你可以:
define(ENVIRONMENT,development);if(!
$db-query($query)if(ENVIRONMENT=development)echo$queryfailed;elseechoDatabaseerror.Pleasecontactadministrator;在服务器中,你可以:
define(ENVIRONMENT,production);if(!
$db-query($query)if(ENVIRONMENT=development)echo$queryfailed;elseechoDatabaseerror.Pleasecontactadministrator;4.使用可跨平台的函数执行命令system,exec,passthru,shell_exec这4个函数可用于执行系统命令.每个的行为都有细微差别.问题在于,当在共享主机中,某些函数可能被选择性的禁用.大多数新手趋于每次首先检查哪个函数可用,然而再使用它.更好的方案是封成函数一个可跨平台的函数./*MethodtoexecuteacommandintheterminalUses:
1.system2.passthru3.exec4.shell_exec*/functionterminal($command)/systemif(function_exists(system)ob_start();system($command,$return_var);$output=ob_get_contents();ob_end_clean();/passthruelseif(function_exists(passthru)ob_start();passthru($command,$return_var);$output=ob_get_contents();ob_end_clean();/execelseif(function_exists(exec)exec($command,$output,$return_var);$output=implode(n,$output);/shell_execelseif(function_exists(shell_exec)$output=shell_exec($command);else$output=Commandexecutionnotpossibleonthissystem;$return_var=1;returnarray(output=$output,status=$return_var);terminal(ls);上面的函数將运行shell命令,只要有一个系统函数可用,这保持了代码的一致性.5.灵活编写函数functionadd_to_cart($item_id,$qty)$_SESSIONcartitem_id=$qty;add_to_cart(IPHONE3,2);使用上面的函数添加单个项目.而当添加项列表的时候,你要创建另一个函数吗?
不用,只要稍加留意不同类型的参数,就会更灵活.如:
functionadd_to_cart($item_id,$qty)if(!
is_array($item_id)$_SESSIONcartitem_id=$qty;elseforeach($item_idas$i_id=$qty)$_SESSIONcarti_id=$qty;add_to_cart(IPHONE3,2);add_to_cart(array(IPHONE3=2,IPAD=5);现在,同个函数可以处理不同类型的输入参数了.可以参照上面的例子重构你的多处代码,使其更智能.6.有意忽略php关闭标签我很想知道为什么这么多关于php建议的博客文章都没提到这点.?
phpechoHello;/Nowdontclosethistag这將节约你很多时间.我们举个例子:
一个super_class.php文件/superextracharacteraftertheclosingtagindex.phprequire_once(super_class.php);/echoanimageorpdf,orsetthecookiesorsessiondata这样,你將会得到一个Headersalreadysenderror.为什么?
因为“superextracharacter”已经被输出了.现在你得开始调试啦.这会花费大量时间寻找superextra的位置.因此,养成省略关闭符的习惯:
!
-?
phpclasssuper_classfunctionsuper_function()/supercode/Noclosingtag这会更好.7.在某地方收集所有输入,一次输出给浏览器这称为输出缓冲,假如说你已在不同的函数输出内容:
functionprint_header()echoSiteLogandLoginlinks;functionprint_footer()echoSitewasmadebyme;print_header();for($i=0;$i;print_footer();替代方案,在某地方集中收集输出.你可以存储在函数的局部变量中,也可以使用ob_start和ob_end_clean.如下:
functionprint_header()$o=SiteLogandLoginlinks;return$o;functionprint_footer()$o=Sitewasmadebyme;return$o;echoprint_header();for($i=0;$i;echoprint_footer();为什么需要输出缓冲:
可以在发送给浏览器前更改输出.如str_replaces函数或可能是preg_replaces或添加些监控/调试的html内容.输出给浏览器的同时又做php的处理很糟糕.你应该看到过有些站点的侧边栏或中间出现错误信息.知道为什么会发生吗?
因为处理和输出混合了.8.发送正确的mime类型头信息,如果输出非html内容的话.输出一些xml.$xml=;$xml=0;/Sendxmldataecho$xml;工作得不错.但需要一些改进.$xml=;$xml=0;/Sendxmldataheader(content-type:
text/xml);echo$xml;注意header行.该行告知浏览器发送的是xml类型的内容.所以浏览器能正确的处理.很多的javascript库也依赖头信息.类似的有javascript,css,jpgimage,pngimage:
JavaScriptheader(content-type:
application/x-javascript);echovara=10;CSSheader(content-type:
text/css);echo#dividbackground:
#000;9.为mysql连接设置正确的字符编码曾经遇到过在mysql表中设置了unicode/utf-8编码,phpadmin也能正确显示,但当你获取内容并在页面输出的时候,会出现乱码.这里的问题出在mysql连接的字符编码./Attempttoconnecttodatabase$c=mysqli_connect($this-host,$this-username,$this-password);/Checkconnectionvalidityif(!
$c)die(Couldnotconnecttothedatabasehost:
.mysqli_connect_error();/Setthecharactersetoftheconnectionif(!
mysqli_set_charset($c,UTF8)die(mysqli_set_charset()failed);一旦连接数据库,最好设置连接的characterset.你的应用如果要支持多语言,这么做是必须的.10.使用htmlentities设置正确的编码选项php5.4前,字符的默认编码是ISO-8859-1,不能直接输出如等.$value=htmlentities($this-value,ENT_QUOTES,CHARSET);php5.4以后,默认编码为UTF-8,这將解决很多问题.但如果你的应用是多语言的,仍然要留意编码问题,.11.不要在应用中使用gzip压缩输出,让apache处理考虑过使用ob_gzhandler吗?
不要那样做.毫无意义.php只应用来编写应用.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 提高 PHP 代码质量的 36 代码 质量
![提示](https://static.bdocx.com/images/bang_tan.gif)