PHP是一门高效的汇集编程言语,因为它具有编写矫捷、运转快速等长处,敏捷成为Web按次员的首选言语。那末如何才华成为一个优良的PHP启示者呢?
要成为一名PHP编程妙手其实不随便马虎,其实不像很多人设想的那样,只需可以大概缓慢地编写几条简略的代码行止理一个庞杂的标题就是PHP编程妙手了,真正的PHP妙手还需要斟酌更多的别的标题。以下三条原则是一名成熟的PHP按次员在编程中应该首先遵循的原则。(北京网站建造)
◆懒散是金
◆编写标致的代码
◆寻求按次的速率,而不是编程的速率
懒散是金
做一个懒散的按次员吗?这个想法主张太新鲜了!因为这个世界上最劳碌的人能够就是较量争论机按次员了。但恰是因为按次员太忙了,以是才应该在编程时学会偷懒。对一个按次员来说,懒散的方法有两种:
其一,斗胆勇敢哄骗现成的别人的按次代码,把这些代码融入到你自己的按次或项目中去。其二是编写一些有效的代码建立一个函数库,网站定制公司,在未来编写按次时可以大概随手拈来,省去了很多反复的休息,自然就可以大概懒散一点了。这两种偷懒的方法都极度符合PHP按次员了。
首先,PHP是在自在开放的情况中降生和发展的一门言语。在世界各地,有不可胜数的按次员,他们一直在为PHP的完满而络续斗争,他们也甘愿准许和别人分享自己的伶俐才智和自己编写的代码。你天天都可以大概从一些PHP网站、邮件列表、新闻组发现多量的优良的按次代码。
多么说,我其实不是激励你整天等着让他报酬你编写代码,但是你可以大概“站在巨人的肩膀上”,充实发扬“拿来主义”,伶俐地利用别人的按次代码可以大概节俭你多量时候。其次,在PHP中,你可以大概便本地建立自己的函数库,多么可以大概在你此后编写按次时省去很多省事。
下面笔者为大家引见几个通用的函数,这些函数有的来自网上的一些开放源代码的项目,有的精选自邮件列表。假定你能把它们参预到你自己的函数库中,日夕你将会发现自己受害无限。
1.通用数据库处理函数
和别的的CGI函数比较,PHP的长处之一是具有很强大的数据库处理才华。但是,在PHP中,对不合的数据库都哄骗一些特定的函数来特意处理,贫乏通用的数据库处理函数。这大大下降了按次代码的可移植性,这也为初学编程的朋侪带来了很多方便。
在网上,很多按次员都经过封装类处理了这个标题。他们编写了同一的函数用来处理任何风行的数据库——岂论是在Linux世界深受欢迎的Mysql还是在Windows平台上普遍风行的SqlServer。(高端网站建立)
就笔者小我私人来说,极度兴味哄骗这些函数,因为可以大概直接哄骗一些简略的诸如”query”、”next_record”之类的函数,而不需要斟酌数据库的毗邻、数据库句柄这些庞杂的东西,更不需要斟酌哄骗的是何种数据库。假定你需要这些函数,你可以大概经过拜候以下的几个网址而获得:
◆http://phplib.netuse.de/
◆http://phpclasses.UpperDesign.com/browse.html/package/20
◆http://phpdb.linuxbox.com/
2.变量调试函数
PHP按次的调试一直是一件让人头疼的事,它既不像VB等低级言语那样有集成的编译调试情况,也不想Perl那样可以大概在Linux或DOS情况下直接运转。其实,我们完全可以大概经过矫捷地哄骗echo语句来完成对PHP的调试事情。下面的几个函数可以大概让你随时检查按次中任何变量的典范及其值。
- function ss_array_as_string (&$array, $column = 0) {
- $str = "Array(n";
- while(list($var, $val) = each($array)){
- for ($i = 0; $i < $column+1; $i++){
- $str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
- }
- $str .= $var. ==> ;
- $str .= ss_as_string($val, $column+1)." n";
- }
- for ($i = 0; $i < $column; $i++){
- $str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
- }
- return $str.);
- }
- function ss_object_as_string (&$object, $column = 0) {
- if (emptyempty($object->classname)) {
- return "$object";
- }
- else {
- $str = $object->classname."( n";
- while (list(,$var) = each($object->persistent_slots)) {
- for ($i = 0; $i < $column; $i++){
- $str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
- }
- global $$var;
- $str .= $var. ==> ;
- $str .= ss_as_string($$var, column+1)." n";
- }
- for ($i = 0; $i < $column; $i++){
- $str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
- }
- return $str.);
- }
- }
- function ss_as_string (&$thing, $column = 0) {
- if (is_object($thing)) {
- return ss_object_as_string($thing, $column);
- }
- elseif (is_array($thing)) {
- return ss_array_as_string($thing, $column);
- }
- elseif (is_double($thing)) {
- return "Double(".$thing.")";
- }
- elseif (is_long($thing)) {
- return "Long(".$thing.")";
- }
- elseif (is_string($thing)) {
- return "String(".$thing.")";
- }
- else {
- return "Unknown(".$thing.")";
- }
- }
需要的时候,在按次中简略地参预下面的一条代码便可检查按次中的所哄骗的变量(包孕数组和工具)的典范和值:
echo ss_as_string($my_variable);
哄骗下面的语句,我们可以大概直接检查按次中扫数的变量的值:
echo ss_as_string($GLOBALS);
3. 控制Log信息的函数
调试PHP按次的别的一种重要的方法就是检查Log信息。假定可以大概便本地控制Log信息的级别和Log信息的体现,内容,将会给按次调试带来更多的便利。下面的几个函数可以大概便本地完成这个功效。
- $ss_log_level = 0;
- $ss_log_filename = /tmp/ss-log;
- $ss_log_levels = array(
- NONE => 0,
- ERROR => 1,
- INFO => 2,
- DEBUG => 3);
- function ss_log_set_level ($level = ERROR) {
- global $ss_log_level;
- $ss_log_level = $level;
- }
- function ss_log ($level, $message) {
- global $ss_log_level, $ss-log-filename;
- if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {
-
- return false;
- }
- $fd = fopen($ss_log_filename, "a+");
- fputs($fd, $level. - [.ss_timestamp_pretty().] - .$message."n");
- fclose($fd);
- return true;
- }
- function ss_log_reset () {
- global $ss_log_filename;
- @unlink($ss_log_filename);
- }
在下面的函数中,有四个Log级别变量。运转PHP按次时,只需当Log的级别低于预设的级别值时,Log信息才华够被记载和体现,出来。例如,在按次中参预以下的一条语句:
ss_log_set_level(INFO);
那末,运转PHP按次时,只需ERROR和INFO级别的LOG信息才华被记载和体现,出来,DEBUG级的信息则被忽视了。除此以外,我们还可以大概设定体现,的信息内容,其语句以下:
ss_log(ERROR, "testing level ERROR");
ss_log(INFO, "testing level INFO");
ss_log(DEBUG, "testing level DEBUG");
你也可以大概随时哄骗下面的语句清空LOG信息:
4.速率测试函数
为了优化代码,我们需要一种可以大概测试代码运转时候的方法,从而来遴选最优的代码。下面的函数可以大概测试运转代码所需的时候:
- function ss_timing_start ($name = default) {
- global $ss_timing_start_times;
- $ss_timing_start_times[$name] = explode( , microtime());
- }
- function ss_timing_stop ($name = default) {
- global $ss_timing_stop_times;
- $ss_timing_stop_times[$name] = explode(, microtime());
- }
- function ss_timing_current ($name = default) {
- global $ss_timing_start_times, $ss_timing_stop_times;
- if (!isset($ss_timing_start_times[$name])) {
- return 0;
- }
- if (!isset($ss_timing_stop_times[$name])) {
- $stop_time = explode(, microtime());
- }
- else {
- $stop_time = $ss_timing_stop_times[$name];
- }
- $current = $stop_time[1] - $ss_timing_start_times[$name][1];
- $current += $stop_time[0] - $ss_timing_start_times[$name][0];
- return $current;
- }
今朝可以大概轻松地查抄任何一段代码的履行时候了,乃至我们可以大概同时哄骗多个计时器,只需在哄骗上述的几个函数时设定不合的参数作为计时器的称呼就可以大概了。
5.调试和优化数据库的把持
对数据库来说,运转速率是至关重要的。虽然很多书籍和文章都讲解了一些快速运转数据库的方法,但是扫数的方法都必须颠末实际的检验。下面我们将把PHPLib函数库中的query()函数和下面引见的几个函数综合起来编写成新的query()函数,和原本的函数比较,这个函数增加了运转时候的监测功效。
- function query($Query_String, $halt_on_error = 1) {
- $this->connect();
- ss_timing_start();
- $this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
- ss_timing_stop();
- ss_log(INFO, ss_timing_current(). Secs - .$Query_String);
- $this->Row = 0;
- $this->Errno = mysql_errno();
- $this->Error = mysql_error();
- if ($halt_on_error && !$this->Query_ID) {
- $this->halt("Invalid SQL: ".$Query_String);
- }
- return $this->Query_ID;
- }
1.将靠山按次与前端按次分开隔离别离
在编写PHP按次时,有些代码是用来处理一些事件,例如把持数据库、遏制数学运算等,而别的的一些代码则只是事件处理的结果体现,出来,例如一些哄骗echo语句将结果以HTML的款式体现,在Web浏览器上的PHP代码和那些直接嵌入PHP按次的HTML代码。首先我们应该了了地分辨这两种代码,把前者称为靠山按次,把后者称为前端按次。
因为PHP是一种嵌入式编程言语,也就是说,扫数的PHP代码都可以大概嵌入到HTML代码当中,这为按次的编写带来了很多便利之处。但是,“物极必反”,假定在一段较长的按次中将PHP代码和HTML代码夹杂编写,这将使按次紊乱无章,晦气于按次的庇护和浏览。
以是我们需要尽能够地将这些按次中混淆于HTML代码中的PHP代码移植出来,在特意的文件中将这些代码封装成函数,然后在HTML代码中哄骗include语句来包括这些文件,在得当的职位调用这些函数便可。
这类做法一方面使HTML代码和PHP代码都简略易读,另外一方面因为HTML代码需要络续更新,而这类别离的方法可以大概确保靠山按次不会被损坏。同前端按次不合,靠山按次更多寻求的是牢固、结构化,极少调换,以是应该细心地设计和管理。其实,在设计台按次时,投入多量时候是值得的,“今朝栽树,此后纳凉”,在此后的设计事情中将可以大概轻松地哄骗今朝编写的靠山按次。
2.矫捷哄骗包括文件
正如背面所说的那样靠山按次应该放置在一系列的包括文件中。包括文件可以大概经过include语句在需要时静态装入,也可以大概在php.ini文件中经过哄骗auto_prepend_file指令事后主动装入。假定哄骗后一种方法的话,虽然获得了与日俱增的好处,但是也有一些缺陷值得我们寄望。下面的一段代码向我们显现知道析一个庞杂的包括文件需要必定的时候:
require(timing.inc);
ss_timing_start();
include(test.inc);
ss_timing_stop();
echo
.ss_timing_current().
;
在下面的代码中,test.inc是一个1000行的包括文件,运转的结果体现,,解析这个包括文件破耗了0.6秒钟,对一个大型网站来说,这个速率其实不是可以大概忽视不记的。哄骗包括文件的别的一个缺陷是:假定一个文件中的一个语句产生缺点,将会使全部网站的PHP按次都没法运转。以是哄骗起来也及其谨严。其实,对包括文件稍做处理,便可以大概使包括文件只在需要时遏制解析。下面的代码使abc.inc文件只在按次需要时才作解析:
if ( defined( __LIBA_INC) ) return;
define( __LIBA_INC, 1 );
/* * 代码... */
3.哄骗面向工具的编程方法
PHP也是一种面向工具的言语,面向工具的编程方法是优良的按次员们极度推重的一种软件设计方法,在PHP编程中可以大概充实阐扬面向工具言语的优势,对编程中的工具遏制封装。在背面的代码中,我们哄骗了面向工具的方法,例如在管理数据库时,我们将query()函数封装进数据库类中,这极大中心便了代码的管理,增加了按次的可读性。
寻求按次速率,而不是编程的速率
在网站建立中,按次运转速率和网页下载速率都是关系成败的重要要素。作为一名Web按次员,应该更加寄望代码的运转速率。下面引见的几种方法都在不合程度上前进了代码的运转速率。
1.哄骗内嵌的HTML代码,而不是PHP的echo语句。
因为PHP是一门嵌入式Web编程言语,可以大概将HTML代码和PHP代码互相嵌入。但是很多按次员担心在HTML代码中过量的哄骗""嵌入PHP代码会多次调用PHP诠释器,从而下降了PHP代码的运转速率,以是甘愿哄骗PHP的echo语句来输入HTML代码,而不直接哄骗HTML代码。
但事实却恰好相反。每一个PHP页面只调用一次PHP诠释器来诠释扫数的PHP代码,以是,只在需要时才嵌入PHP代码,而大多数的时候直接哄骗HTML代码输入结果,不只不会下降按次的运转速率,并且因为镌汰了对echo语句的解析,通常可以大概前进代码的运转速率。下面的一段代码证清楚明了我们的结论。在这段代码中,我们哄骗了背面引见的时候测试函数。
2.哄骗str-replace而不是ereg-replace
习惯哄骗Perl遏制编程的按次员更加甘愿准许哄骗ereg_replace完成字符串替代事情,因为在PHP中ereg_replace的用法和Perl中情势婚配的用法附近。但是,下面的这段代码证明,哄骗str_replace 代替 ereg_replace将可以大概大大前进代码的运转速率。测试str_replace和ereg_replace的运转速率:
//这段代码测试str_replace的运转速率 emphasis; ?>
for ($i=0; $i<1000; $i++) {
str_replace(i>, b>, $string).
;
}
//这段代码测试ereg_replace的运转速率
for ($i=0; $i<1000; $i++) {
ereg_replace(<([/]*)i>, <\1b>, $string).
;
}
3.寄望字符串的引用
PHP和别的很多编程言语一样,可以大概哄骗双引号("")来引用字符串,也可以大概哄骗单引号()。但是在PHP中,假定哄骗双引号来引用字符串,那末PHP解析器将首先说明字符串中有没有对变量的引用,有变量的话,将对变量遏制替代。假定是单引号,则没有如斯庞杂——直接将单引号包括起来的扫数字符串直接体现,出来。明显,在PHP编程中,假定哄骗单引号引用字符串变量要比哄骗双引号快速一些。
4.在数据库中避免哄骗结合把持
比起别的的Web编程言语来说,PHP的数据库功效非常强大。但是在PHP中数据库的运转依然是一件非常费时辛苦的事情,以是,作为一个Web按次员,要虽然镌汰数据库的查询把持,同时应该为数据库建立得当的索引。
另外一件值得寄望的事情是在用PHP把持数据库时,尽能够不哄骗多个数据表的结合把持,虽然结合把持可以大概增强数据库的查询功效,但是却大大增加了效力器的肩负。为了声名这个标题,我们可以大概看看下面的这个简略的例子。
我们在数据库中建立了两个数据表foo和big_foo。在数据表foo中,只需一个字段,包括了从1-1000之间的扫数自然数。数据表big_foo一样只需一个字段,但包括了从1-1,000,000之间的扫数自然数。以是,从巨细上说,big_foo即是foo与它自己遏制了结合把持。
$db->query("select * from foo");
0.032273 secs
$db->next_record();
0.00048999999999999 secs
$db->query("insert into foo values (NULL)");
0.019506 secs
$db->query("select * from foo as a, foo as b");
17.280596 secs
$db->query("select * from foo as a, foo as b where a.id > b.id");
14.645251 secs
$db->query("select * from foo as a, foo as b where a.id = b.id");
0.041269 secs
$db->query("select * from big_foo");
25.393672 secs
从下面把持结果我们可以大概发现,对两个有1000条记载的数据表遏制结合,其速率其实不比对一个1000000条记载的大型数据表零丁遏制把持快若干。
5.寄望include与require的分辨
在PHP变成中,include()与require()的功效雷同,但在用法上却有一些不合,include()是有前提包括函数,而require()则是无前提包括函数。例如在下面的一个例子中,假定变量$somgthing为真,则将包括文件somefile:
if($something){
include("somefile");
}
但岂论$something取何值,下面的代码将把文件somefile包括进文件里:
if($something){
require("somefile");
}
下面的这个风趣的例子充实申清楚明了这两个函数之间的不合。
$i = 1;
while ($i < 3) {
require("somefile.$i");
$i++;
}
在这段代码中,每次循环的时候,按次都将把同一个文件包括出来。很明显这不是按次员的初志,从代码中我们可以大概看出这段代码希冀在每次循环时,将不合的文件包括出去。假定要完成这个功效,必须乞助函数include();
$i = 1;
while ($i < 3) {
include("somefile.$i");
$i++;
}
6.寄望echo和print的分辨
PHP中echo和print的功效也根本雷同,但是两者之间也有纤细差别。在PHP代码中可以大概把print作为一个浅显函数来哄骗,例如履行下面的代码后变量$res的值将为1。
$ret = print "Hello World";
这意味着print可用在一些庞杂的表达式中,而echo则不可。一样,在代码中echo语句的运转速率要略微快于print语句,因为echo语句不要求前去任何数值。