1、提高 PHP 代码质量的 36 计提高 PHP 代码质量的 36 计1.不要使用相对路径常常会看到:require_once(././lib/some_class.php);该方法有很多缺点:它首先查找指定的 php包含路径,然后查找当前目录.因此会检查过多路径.如果该脚本被另一目录的脚本包含,它的基本目录变成了另一脚本所在的目录.另一问题,当定时任务运行该脚本,它的上级目录可能就不是工作目录了.因此最佳选择是使用绝对路径:define(ROOT,/var/www/project/);require_once(ROOT././lib/some_class.php);/rest of the c
2、ode我们定义了一个绝对路径,值被写死了.我们还可以改进它.路径/var/www/project 也可能会改变,那么我们每次都要改变它吗?不是的,我们可以使用_FILE_常量,如:/suppose your script is/var/www/project/index.php/Then _FILE_ will always have that full path.define(ROOT,pathinfo(_FILE_,PATHINFO_DIRNAME);require_once(ROOT././lib/some_class.php);/rest of the code现在,无论你移到哪个目录
3、,如移到一个外网的服务器上,代码无须更改便可正确运行.2.不要直接使用 require,include,include_once,required_once可以在脚本头部引入多个文件,像类库,工具文件和助手函数等,如:require_once(lib/Database.php);require_once(lib/Mail.php);require_once(helpers/utitlity_functions.php);这种用法相当原始.应该更灵活点.应编写个助手函数包含文件.例如:function load_class($class_name)/path to the class file$
4、path=ROOT./lib/.$class_name.php);require_once($path);load_class(Database);load_class(Mail);有什么不一样吗?该代码更具可读性.將来你可以按需扩展该函数,如:function load_class($class_name)/path to the class file$path=ROOT./lib/.$class_name.php);if(file_exists($path)require_once($path);还可做得更多:为同样文件查找多个目录能很容易的改变放置类文件的目录,无须在代码各处一一修改可使
5、用类似的函数加载文件,如 html内容.3.为应用保留调试代码在开发环境中,我们打印数据库查询语句,转存有问题的变量值,而一旦问题解决,我们注释或删除它们.然而更好的做法是保留调试代码.在开发环境中,你可以:define(ENVIRONMENT,development);if(!$db-query($query)if(ENVIRONMENT=development)echo$query failed;else echo Database error.Please contact administrator;在服务器中,你可以:define(ENVIRONMENT,production);if(
6、!$db-query($query)if(ENVIRONMENT=development)echo$query failed;else echo Database error.Please contact administrator;4.使用可跨平台的函数执行命令system,exec,passthru,shell_exec 这 4个函数可用于执行系统命令.每个的行为都有细微差别.问题在于,当在共享主机中,某些函数可能被选择性的禁用.大多数新手趋于每次首先检查哪个函数可用,然而再使用它.更好的方案是封成函数一个可跨平台的函数./*Method to execute a command in t
7、he terminal Uses:1.system 2.passthru 3.exec 4.shell_exec*/function terminal($command)/system if(function_exists(system)ob_start();system($command,$return_var);$output=ob_get_contents();ob_end_clean();/passthru else if(function_exists(passthru)ob_start();passthru($command,$return_var);$output=ob_get_
8、contents();ob_end_clean();/exec else if(function_exists(exec)exec($command,$output,$return_var);$output=implode(n,$output);/shell_exec else if(function_exists(shell_exec)$output=shell_exec($command);else$output=Command execution not possible on this system;$return_var=1;return array(output=$output,s
9、tatus=$return_var);terminal(ls);上面的函数將运行 shell命令,只要有一个系统函数可用,这保持了代码的一致性.5.灵活编写函数function add_to_cart($item_id,$qty)$_SESSIONcartitem_id=$qty;add_to_cart(IPHONE3,2);使用上面的函数添加单个项目.而当添加项列表的时候,你要创建另一个函数吗?不用,只要稍加留意不同类型的参数,就会更灵活.如:function add_to_cart($item_id,$qty)if(!is_array($item_id)$_SESSIONcartitem_
10、id=$qty;else foreach($item_id as$i_id=$qty)$_SESSIONcarti_id=$qty;add_to_cart(IPHONE3,2);add_to_cart(array(IPHONE3=2,IPAD=5);现在,同个函数可以处理不同类型的输入参数了.可以参照上面的例子重构你的多处代码,使其更智能.6.有意忽略 php关闭标签我很想知道为什么这么多关于 php建议的博客文章都没提到这点.?phpecho Hello;/Now dont close this tag这將节约你很多时间.我们举个例子:一个 super_class.php 文件/super
11、extra character after the closing tagindex.phprequire_once(super_class.php);/echo an image or pdf,or set the cookies or session data这样,你將会得到一个 Headers already send error.为什么?因为“super extra character”已经被输出了.现在你得开始调试啦.这会花费大量时间寻找 super extra 的位置.因此,养成省略关闭符的习惯:!-?php class super_class function super_fun
12、ction()/super code/No closing tag这会更好.7.在某地方收集所有输入,一次输出给浏览器这称为输出缓冲,假如说你已在不同的函数输出内容:function print_header()echo Site Log and Login links;function print_footer()echo Site was made by me;print_header();for($i=0;$i;print_footer();替代方案,在某地方集中收集输出.你可以存储在函数的局部变量中,也可以使用ob_start和 ob_end_clean.如下:function pri
13、nt_header()$o=Site Log and Login links;return$o;function print_footer()$o=Site was made by me;return$o;echo print_header();for($i=0;$i;echo print_footer();为什么需要输出缓冲:可以在发送给浏览器前更改输出.如 str_replaces 函数或可能是 preg_replaces 或添加些监控/调试的 html内容.输出给浏览器的同时又做 php的处理很糟糕.你应该看到过有些站点的侧边栏或中间出现错误信息.知道为什么会发生吗?因为处理和输出混合了
14、.8.发送正确的 mime类型头信息,如果输出非 html内容的话.输出一些 xml.$xml=;$xml=0;/Send xml dataecho$xml;工作得不错.但需要一些改进.$xml=;$xml=0;/Send xml dataheader(content-type:text/xml);echo$xml;注意 header行.该行告知浏览器发送的是 xml类型的内容.所以浏览器能正确的处理.很多的 javascript库也依赖头信息.类似的有 javascript,css,jpg image,png image:JavaScriptheader(content-type:appli
15、cation/x-javascript);echo var a=10;CSSheader(content-type:text/css);echo#div id background:#000;9.为 mysql连接设置正确的字符编码曾经遇到过在 mysql表中设置了 unicode/utf-8编码,phpadmin也能正确显示,但当你获取内容并在页面输出的时候,会出现乱码.这里的问题出在 mysql连接的字符编码./Attempt to connect to database$c=mysqli_connect($this-host,$this-username,$this-password);
16、/Check connection validityif(!$c)die(Could not connect to the database host:.mysqli_connect_error();/Set the character set of the connectionif(!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只应用来编写应用.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1