收集的php编写大型网站问题集


Posted in PHP onMarch 06, 2007

PHP以其易用性得到迅速的推广,但易用并不是说就能用好它,实际上许多程序员用它很容易的立一个个WEB应用系统,但又有多少人仔细的考虑过他们的代码,是否容易维护、是否足够健壮、否效率足够高、是否足够安全,当PHP用于建立大型网站时这些就成为很关键的因素。下面我们从较轻微的问题开始讨论,直至一些致命的错误。共分三部分。 
  第一部分、较轻微的错误 

  一、Printf(), 
  

该函数主要用来格式化显示数据。当你要改变某个数据的显示格式时才使用。 
  例如以不同的精度来显示PI(3.1415926)的值。 
  <?php 
   /* 
   * The three faces of Π 
   */ 

   printf ("Pi is: %.2f\n<br>\n", M_PI); 
   printf ("Pi is also: %.3f\n<br>\n", M_PI); 
   printf ("Pi is also: %.4f\n<br>\n", M_PI); 
  ?> 

  

但许多程序员仅仅为显示一些变量值和函数返回值使用该函数。因为Printf()在显示数据前要先格式化该数据以速度较慢,因此,仅为了显示数据时应用print和echo,以提高速度。 

  二、语意检查 
  

PHP是一种弱类型语言,也就是说在使用一个变量前不用定义,这样给编程带来了很大的方便和灵活,但你自己必须知道该变量到底应该是哪种类型,因为该变量在运行时仍实际对应着某一种类型(各种类型之间可以自由互相转换),没有类型的变量是不存在的。有可能PHP并不能检查出你的语意错误,但由于变量类型的变化,会导致一些潜在的问题的发生。另外一个值得注意的问题是变量的范围,它也可能会导致一些潜在的问题的发生。 
  在PHP中有以下几种基本变量: 
  Boolean, resource, integer, double, string, array and object。 

  三、临时变量的使用 
  

临时变量的滥用会导致程序运行效率的降低。何时使用临时变量可基于以下两点考虑: 
  1、该变量是否至少使用两次。 
  2、该变量的使用是否会显著提高程序的可读性。 
  如果一条也不满足,则省略该变量的使用。例如: 
  <?php 
   $tmp = date ("F d, h:i a"); /* ie January 3, 2:30 pm */ 
   print $tmp; 
  ?> 
  就应该改成: 
  <?php 
   print date ("F d, h:i a"); 
  ?> 

  又如: 
  <?php 

  // string reverse_characters(string str) 
  // Reverse all of the characters in a string. 
  function reverse_characters ($str) 
  { 
   return implode ("", array_reverse (preg_split("//", $str))); 
  } 

  ?> 
  的可读性不强,可改成: 
  <?php 

  // string reverse_characters(string str) 
  // Reverse all of the characters in a string. 
  function reverse_characters ($str) 
  { 
   $characters = preg_split ("//", $str); 
   $characters = array_reverse ($characters); 

   return implode ("", $characters); 
  } 

  ?> 

  四、客户端和服务器端代码的分离 
  

客户端和服务器端代码的在PHP程序中实际上就是HTML代码和PHP语言代码,很多人把HTML和PHP语句混合在一个文件里,使得这文件很大,这种风格对程序的维护和再开发很不利,不适合大型站点的开发。一般有两种方法把HTML和PHP语句分开: 
  1、编写专用API,例如: 

  index.php ? The Client side 
  <?php include_once ("site.lib"); ?> 
  <html> 
  <head> 
  <title> <?php print_header (); ?> </title> 
  </head> 
  <body> 
  <h1> <?php print_header (); ?> </h1> 
  <table border="0" cellpadding="0" cellspacing="0"> 
  <tr> 
  <td width="25%"> 
  <?php print_links (); ?> 
  </td> 
  <td> 
  <?php print_body (); ?> 
  </td> 
  </tr> 
  </table> 
  </body> 
  </html> 

   
  site.lib ? The server side code 

   
  <?php 

  $dbh = mysql_connect ("localhost", "sh", "pass") 
  or die (sprintf ("Cannot connect to MySQL [%s]: %s", 
  mysql_errno (), mysql_error ())); 
  @mysql_select_db ("MainSite") 
  or die (sprintf ("Cannot select database [%s]: %s", 
  mysql_errno (), mysql_error ())); 

  $sth = @mysql_query ("SELECT * FROM site", $dbh) 
  or die (sprintf ("Cannot execute query [%s]: %s", 
  mysql_errno (), mysql_error ())); 

  $site_info = mysql_fetch_object ($sth); 

  function print_header () 
  { 
   global $site_info; 
   print $site_info->header; 
  } 

  function print_body () 
  { 
   global $site_info; 
   print nl2br ($site_info->body); 
  } 

  function print_links () 
  { 
   global $site_info; 

   $links = explode ("\n", $site_info->links); 
   $names = explode ("\n", $site_info->link_names); 

  for ($i = 0; $i < count ($links); $i++) 
  { 
   print "\t\t\t 
   <a href=\"$links[$i]\">$names[$i]</a> 
   \n<br>\n"; 
  } 
  } 
  ?> 

  这种方法使得程序看起来比较简洁,而且执行速度也较快。 

  2、使用模板的方法 
  这种方法使得程序看起来更简洁,同样实现上面的功能,可用以下代码: 
  <html> 
  <head> 
  <title>%%PAGE_TITLE%%</title> 
  </head> 
  <body %%BODY_PROPERTIES%%> 
  <h1>%%PAGE_TITLE%%</h1> 
  <table border="0" cellpadding="0" cellspacing="0"> 
  <tr> 
  <td width="25%">%%PAGE_LINKS%%</td> 
  <td>%%PAGE_CONTENT%%</td> 
  </tr> 
  </table> 
  </body> 
  </html> 

  

用占位符代替要动态生成的内容,然后用一解析程序分析该模板文件,把占位符用际的内容替换。种方法使得即使不会使用PHP的页面制作人员也能修改模板文件。这种方法的缺点是执行效率不高,因为要解释模板文件。同时实现起来也比较复杂。 

  注: www.thewebmasters.net的 FastTemplate class可方便的实现以上功能。 

  五、不要用过时的函数 
  作为一种自由软件,PHP发展很快,其中的很多函数都已过时,例如: 

  while (1): 
  print "5"; 
  if ($idx++ == 5): 
  break; 
  endif; 
  endwhile; 

  

虽然还能用但效率肯定不高,而且可能在以后的版本中会禁用,导致程序不能运行。因此要经常对照最新PHP手册检查那些函数已过时及时修正。

PHP 相关文章推荐
example2.php
Oct 09 PHP
树型结构列出指定目录里所有文件的PHP类
Oct 09 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
Joomla调用系统自带编辑器的实现方法
May 05 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
用PHP实现Ftp用户的在线管理的代码
Mar 06 #PHP
个人站长制做网页常用的php代码
Mar 03 #PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 #PHP
给php新手谈谈我的学习心得
Feb 25 #PHP
Smarty+QUICKFORM小小演示
Feb 25 #PHP
php简单封装了一些常用JS操作
Feb 25 #PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 #PHP
You might like
wamp安装后自定义配置的方法
2014/08/23 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
php绘制一条直线的方法
2015/01/24 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
PHP简单遍历对象示例
2016/09/28 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
PHP图片水印类的封装
2017/07/06 PHP
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
2014/01/14 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
2019/07/23 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
基于element-ui对话框el-dialog初始化的校验问题解决
2020/09/11 Javascript
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
用Django写天气预报查询网站
2018/10/21 Python
在pytorch中对非叶节点的变量计算梯度实例
2020/01/10 Python
Python代码注释规范代码实例解析
2020/08/14 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
GWebs公司笔试题
2012/05/04 面试题
元旦促销方案
2014/03/15 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
高中运动会广播稿
2014/09/16 职场文书
参观邀请函范文
2015/02/02 职场文书
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏