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 - $ss_timing_start_times[$name];
$current += $stop_time - $ss_timing_start_times[$name];
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语句不请求前往任何数值。
你的留言本应该加入注册以及分页功能了,而如果你更强的话,UI(用户界面)也可以加强,完成之后,感觉是不是特有成就感?不管怎么样,咱好歹是写了一个动态网站程序了,放在自己的网站上耍耍吧。 Ps:以上纯属原创,如有雷同,纯属巧合 先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。 首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 基础有没有对学习php没有太大区别,关键是兴趣。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 做为1门年轻的语言,php一直很努力。 基础有没有对学习php没有太大区别,关键是兴趣。 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
页:
[1]