优异的PHP开辟者是怎样炼成的?[网站编程]
本文“优异的PHP开辟者是怎样炼成的?[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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 .= “ ”;
}
$str .= $var. ==> ;
$str .= ss_as_string($val, $column+1).” n”;
}
for ($i = 0; $i < $column; $i++){
$str .= “ ”;
}
return $str.);
}
function ss_object_as_string (&$object, $column = 0) {
if (empty($object->classname)) {
return “$object”;
}
else {
$str = $object->classname.”( n”;
while (list(,$var) = each($object->persistent_slots)) {
for ($i = 0; $i < $column; $i++){
$str .= “ ”;
}
global $$var;
$str .= $var. ==> ;
$str .= ss_as_string($$var, column+1).” n”;
}
for ($i = 0; $i < $column; $i++){
$str .= “ ”;
}
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]) {
// 不显示Log信息
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信息:
ss_log_reset();
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语句不要求返回任何数值.
以上是“优异的PHP开辟者是怎样炼成的?[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |