仓酷云

标题: PHP网站制作之用PEAR来写你的下一个php法式 [打印本页]

作者: 若相依    时间: 2015-2-16 00:28
标题: PHP网站制作之用PEAR来写你的下一个php法式
在这里想谈谈自己这六个多月的PHP学习心得,希望对给比我还新的新手们有所帮助,讲的不是很深刻,甚至有的想法可能是错误的,希望不要误导新人才好,大家要有自己的主见。法式       你能够已是个PHP的内行了,写了良多十分棒的代码。然而,假如你如今要把它们到场到你如今的项目中去,是不是有些费劲?你的伴侣想利用你的代码作为他的项目中的一个模块,然而你发明你们利用了一模一样的编码作风,让他顺应,乃至不如重写一个!
请跟我来,利用PEAR尺度编写你的PHP法式吧,你的法式将会具有更大的活气,你的法式和代码将会很便利地和其他高手的代码交融在一同,PEAR就象CPAN关于PERL一样,会让PHP发生更高的能量。

甚么是PEAR
PEAR是PHP扩大与使用库(the PHP Extension and Application Repository)的缩写。它是一个PHP扩大及使用的一个代码仓库,复杂地说,PEAR就是PHP的CPAN。

为何要利用PEAR?
PHP是一个十分优异的剧本言语,简约、高效,跟着4.0的宣布,愈来愈多的人利用它来停止静态网站的开辟,可以说,PHP已成为最优异的INTERNET开辟言语之一,特别关于那些需求可以疾速、高效地开辟中小范围的贸易使用的网站开辟人员,PHP是其首选的言语。然而跟着PHP的使用的不休增多,关于这些使用缺少一致的尺度和无效的办理,因而,PHP社区很难象PERL社区的人们那样便利的同享彼此的代码和使用,由于PHP缺少象CPAN那样的一致的代码库来分类办理使用的代码模块(熟习PERL的人都晓得,CPAN是一个伟大的PERL的扩大模块仓库,编写的使用模块可以放在CPAN上面的恰当的分类目次上面,其他的人可以很便利地复用,固然,你编写使用模块时分也需求恪守个中的原则。)

为此,PEAR就应运而生了,而且从4.04入手下手,跟着PHP中心一同被分发。

PEAR能给我带来甚么优点?
1.如前所述,PEAR依照必定的分类来办理PEAR使用代码库,你的PEAR代码可以组织到个中恰当的目次中,其他的人可以便利地检索并分享到你的功效。

2.PEAR不单单是一个代码仓库,它同时也是一个尺度,利用这个尺度来书写你的PHP代码,将会加强你的法式的可读性,复用性,削减失足的概率。

3.PEAR经由过程供应2个类为你搭建了一个框架,完成了诸如析构函数,毛病捕捉功效,你经由过程承继就能够利用这些功效。

PEAR的编码划定规矩
PEAR的编码划定规矩包含缩进划定规矩,掌握布局,函数挪用,函数界说,正文,包括代码,PHP标志,文件头的正文块,CVS标志,URL样例,常量的定名这11方面。上面扼要地引见一下:

缩进划定规矩:
PEAR中需求利用4个空格来缩排代码,而且不利用TAB。假如你利用VIM,将以下设置放入你的~/.vimrc中:
set expandtab
set shiftwidth=4
set tabstop=4


假如,你利用Emacs/XEmacs,需求把indent-tabs-mode 设置成nil。

不外你象我一样喜好用(X)Emacs编纂PHP文件,我激烈保举你装置PHP-MODE,如许当你编写PEAR代码的时分,它会主动调剂你的缩排作风,固然PHP-MODE还有很多很优异的特征,你可以从资本列表中的中央下载最新版的PHP-MODE。

掌握布局:
这里所说的掌握布局包含: if for while switch 等。关于掌握布局,在关头字(如if for ..)前面要空一个格,然后再跟掌握的圆括号,如许,不至于和函数挪用搅浑,另外,你应当尽可能完全的利用花括号{},即便从语法下去说是可选的。如许可以避免你今后需添加新的代码行时发生逻辑上的困惑或毛病。这里是一个样例:
if ((前提1) && (前提2)) {
    语句1;
}esleif ((前提3) || (前提4)) {
    语句2;
}else {
    语句3;
}




函数挪用:
关于函数挪用,函数名和左括号( 之间不该该有空格,关于函数参数,在分隔的逗号和下一个参数之间要有不异的空格分别,最初一个参数和右括号之间不克不及有空格。上面是一个尺度的函数挪用;
$result = foo($param1, $param2, $param3);
不标准的写法:
$result=foo ($param1,$param2,$param3);
$result=foo( $param1,$param2, $param3 );




另外,假如要将函数的前往了局赋值,那末在等号和所赋值的变量之间要有空格,同时,假如是一系列相干的赋值语句,你添加恰当的空格,使它们对齐,就象如许:
$result1 = $foo($param1, $param2, $param3);
$var2    = $foo($param3);
$var3    = $foo($param4, $param5);




函数界说:
函数界说遵守"one true brace"风俗:
function connect(&$dsn, $persistent = false)
{
    if (is_array($dsn)) {
        $dsninfo = &$dsn;
    } else {
        $dsninfo = DB::parseDSN($dsn);
    }

    if (!$dsninfo || !$dsninfo['phptype']) {
        return $this->raiseError();
    }
    return true;
}


如上所示,可选参数要在参数表的末尾,而且老是尽可能前往成心义的函数值。

关于正文:
关于类的在线文档,应当可以被PHPDoc转换,就象JavaDoc那样。PHPDoc也是一个PEAR的使用法式,更具体的引见你可以去 http://www.phpdoc.de/ 检查。除类的在线文档,建议你应当利用非文档性质的正文来诠释你的代码,当你看到一段代码时想:哦,我想不需求在文档里去细心描写它吧。那末你最好给这段代码作一个复杂的正文,如许避免你会健忘它们是若何任务的。关于正文的模式,C的 /* */和C++的//都不错,不外,不要利用Perl或shell的#正文体例。

包括代码:
不管甚么时分,当你需求无前提包括进一个class文件,你必需利用requre_once;当你需求前提包括进一个class文件,你必需利用include_once;如许可以包管你要包括的文件只会包括一次,而且这2个语句共用统一个文件列表,所以你不必忧虑两者会搅浑,一旦require_once 包括了一个文件,include_once不会再反复包括不异的文件,反之亦然。

PHP代码标志:
任什么时候候都要利用<?php ?>界说你的php代码,而不要复杂地利用<? ?>,如许可以包管PEAR的兼容性,也利于跨平台的移植。

文件头的正文声明:
一切需求包括在PEAR中心宣布的PHP代码文件,在文件入手下手的时分,你必需到场以下的正文声明:
/* vim: set expandtab tabstop=4 shiftwidth=4: */

// +----------------------------------------------------------------------+

// | PHP version 4.0                                                      |

// +----------------------------------------------------------------------+

// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             |

// +----------------------------------------------------------------------+

// | This source file is subject to version 2.0 of the PHP license,       |

// | that is bundled with this package in the file LICENSE, and is        |

// | available at through the world-wide-web at                           |

// | http://www.php.net/license/2_02.txt.                                 |

// | If you did not receive a copy of the PHP license and are unable to   |

// | obtain it through the world-wide-web, please send a note to          |

// | license@php.net so we can mail you a copy immediately.               |

// +----------------------------------------------------------------------+

// | Authors: Original Author                         |

// |          Your Name                                  |

// +----------------------------------------------------------------------+

//

// $Id$


关于不在PEAR中心代码库中的文件,建议你也在文件的入手下手处有如许一个相似的正文块,标明版权,协定,作者等等。同时也在第一行到场VIM的MODELINE,如许在VIM中可以坚持PEAR的代码作风。

CVS标志:
如下面所展现那样,在每一个文件中到场CVS的ID标志,假如你编纂或修正的文件中没有这个标志,那末请到场,或是交换原文件中相相似的体现模式(如"Last modified"等等)

URL样本:
你可以参照RFC 2606,利用"www.example.com"作为一切的URL样本。

常量定名:
常量应当尽可能利用大写,为了便于了解,利用下划线朋分每一个单词。同时,你应当常量地点的包名或是类名作为前缀。好比,关于Bug类中常量应当以Bug_入手下手。以上是PEAR的编码划定规矩,具体的编码划定规矩可以参考PEAR中的CODING_STANDDARD文件的申明。为了更好地舆解这些编码划定规矩,你也能够参考一下现有PEAR中心模块的代码。

入手下手利用PEAR

PEAR
利用PEAR很复杂,你只需如许界说你本人的PEAR法式:
require_once "PEAR.php";
class your_class_name extends PEAR{
    你的类界说...
}




固然,你需求恪守后面说的PEAR的编码划定规矩,以后你就能够在你的类外部完成你要做的工作了。上面,咱们睁开会商一下,实践上PEAR为咱们供应了2个预界说类:
PEAR:这是PEAR的基类,一切的PEAR扩大都要从它承继派生出来。
PEAR_Error:PEAR的毛病处置的基类,你可以选择派生出本人的毛病处置的类。

普通来讲,你不该该直接创立PEAR的实例,而是要本人派生出一个新的类,然后再创立这个新类的实例。作为基类,PEAR给咱们供应了一些有效的功效,最次要的就是析构函数和毛病处置

析构函数
PHP撑持机关函数,然而其实不撑持析构函数,不外,PHP供应register_shutdown_function()这个函数,从而可以在剧本终止前回调注册的函数,因而PEAR使用这个特征,供应了析构函数的仿真。假设你有一个PEAR的子类,叫做mypear,那末在mypear类中,你可以界说一个函数,函数名是下划线加上你的类名,_mypear(),这个函数就是这个类的析构函数。不外这个析构函数和C++中的析构函数不太一样,它不会在对象被删除的时分履行,而是在剧本停止的时分,究竟这只是一个仿真。因为是利用了register_shutdown_function(),所以在你的析构函数里,打印的信息将不会前往阅读器中。另外,在你的机关函数中,需求挪用一下它的父类的机关函数,由于PHP不会主动挪用父类的机关函数,而析构函数需求在PEAR的机关函数中注册,咱们可以看看PEAR的源代码:
<code>
function PEAR() {
if (method_exists($this, "_".get_class($this))) {
    global $_PEAR_destructor_object_list;
    $_PEAR_destructor_object_list[] = &$this;
}
if ($this->_debug) {
    printf("PEAR constructor called, class=%s\n",
           get_class($this));
}   
.....
function _PEAR_call_destructors() {
    global $_PEAR_destructor_object_list;
    if (is_array($_PEAR_destructor_object_list) && sizeof($_PEAR_destructor_object_list)) {
    reset($_PEAR_destructor_object_list);
    while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
        $destructor = "_".get_class($objref);
        if (method_exists($objref, $destructor)) {
        $objref->$destructor();
        }
    }
    //清空已注册的对象列表,

    //避免反复挪用

    $_PEAR_destructor_object_list = array();

    }

}

....   
register_shutdown_function("_PEAR_call_destructors");
</code>




下面这段代码展现了PEAR是若何完成析构函数的,在构件函数中,将反省以后类中是不是有析构函数,假如有,那末将把以后类的援用放入一个全局列表中,在_PEAR_call_destructors中,则反省这个全局列表中的每一个元素是不是存在响应的析构函数,假如有,则挪用它,最初将全局列表清空。

在PEAR.php的最初一行代码,则挪用register_shutdown_function("_PEAR_call_destructors"),注册_PEAR_call_destructors,如许,当剧本履行终了的时分,PHP会回调这个函数。利用析构函数,你可以在处置完用户的恳求,加入之前做一些需要的"善后"任务,典范的例子是,你可以封闭翻开的文件,断开数据库的毗连,将某些数据存入磁盘等等。

毛病处置
PEAR中可让你有良多的体例来处置毛病,你不单单是复杂地前往一个毛病代码,或毛病的信息,而是可以前往一个PEAR_Error对象,或是由PEAR_Error派生出来的新的毛病对象。

PEAR中的毛病对象的并没无限定详细的输入模式,它可以仅仅是捕捉毛病,不给用户前往太多的信息,也能够是去回调一个特别毛病处置函数,同时,即便输入毛病信息,它也强制你必需如果HTML模式,你可以输入XML,CSV模式,或是其他你本人界说的模式,你只需求从PEAR_Error派生一个新的类,然后在恰当的时分创立并"抛出"这个新类的对象就能够了。

复杂的毛病处置:
在PEAR中,最复杂的毛病处置是"抛出"这个毛病,你只需复杂地创立并前往一个PEAR_Error的对象就能够了。上面是一个复杂的例子:
<code>
function myconnect($host = "localhost", $port = 1080)
{
    $fp = fsockopen($host, $port, $errno, $errstr);
    if (!is_resource($fp)) {
        return new PEAR_Error($errstr, $errno);
    }
    return $fp;
}

$sock = myconnect();
if (PEAR::isError($sock)) {
    print "connect error: ".$sock->getMessage()."<BR>\n"
}
</code>


如下面代码所展现的,在履行一段能够发生毛病的代码后,你需求利用PEAR的isError来检测是不是存在毛病,而且可使用PEAR_Error的getMessage来获得比来一次的毛病信息。注重:必定要在关头的中央利用利用PEAR::isError

利用raiseError

PHP4.0.5今后,PEAR多了2个函数:
setErrorHandling($mode, $options = null)
raiseError($message = null, $code = null, $mode = null,$options = null, $userinfo = null)


前者可以设置PEAR缺省的毛病处置形式,后者是一个包装函数,前往一个PEAR_Error的对象,和直接创立并前往PEAR_Error的对象略有分歧的是,假如省略$mode,$options等参数,它会利用缺省值来创立这个PEAR_Error的对象,这些缺省值你可使用setErrorHandling()来定制。

PEAR_Error
PEAR_Error是PEAR的毛病对象的一个基类,和PEAR分歧,普通来讲,你可以直接创立PEAR_Error的实例,创立体例:
$error = new PEAR_Error($message, $code, $mode, $options, $userinfo);

$message是你的毛病信息,$code是该毛病的毛病号,后3个参数是严密接洽的:
$mode:是这个毛病的处置形式,可以以下常量:
PEAR_ERROR_RETURN:仅仅前往该毛病对象(缺省体例)
PEAR_ERROR_PRINT:在构建函数中打印这个毛病信息,然而以后法式会持续运转。
PEAR_ERROR_TRIGGER:利用PHP的trigger_error() 触发一个毛病,假如你已设置了毛病处置函数,或你把PHP的毛病处置级别设置为E_USER_ERROR,那末以后法式将会被终止。
PEAR_ERROR_DIE:打印毛病并加入,法式终止。
PEAR_ERROR_CALLBACK:利用一个回调函数或办法来处置以后毛病,法式终止。
$options:这个参数只要在$mode是PEAR_ERROR_TRIGGER和PEAR_ERROR_CALLBACK的时分才起感化,假如是PEAR_ERROR_TRIGGER,$options必需是E_USER_NOTICE, E_USER_WARNING 或 E_USER_ERROR这3个常量的一个,同PHP中trigger_error的值分歧。假如$mode是PEAR_ERROR_CALLBACK,$options可所以一个字符串,内容是要回调的函数名,也能够是一个2元素的数组,分离是一个对象变量,和一个字符串(标明要挪用的办法)。
$userinfo:寄存附加的用户信息,你可以把相干的调试信息放在这里。
PEAR_Error中有一些经常使用的办法,这些办法在PHP文挡没有描写,这里逐一列出:

int getMode:前往以后的毛病处置形式,整型。
string getMessage:前往以后完全的毛病信息,字符串。
mixed getCallback:前往以后的回调信息,多是所回调的函数名,或是(对象,办法)的数组。
int getCode:前往整型的毛病代码。
string getType:前往毛病的类型,也就是以后的类名,字符串。
string getUserInfo:前往附加的用户信息,字符串。
string getDebugInfo:内容同上。
string toString:前往以后对象的具体字符串描写,内容包含毛病处置的形式,级别,毛病信息,毛病代码,相干回调函数等等。

总结
至此,关于PEAR的引见就停止了。归纳综合地说,假如你要做一个PEAR的扩大使用,需求这么做:

require_once "PEAR.php"
利用class your_pear_extend extends PEAR{}界说你的新类。
在你的类的机关函数中,挪用父类PEAR的机关函数:
function your_pear_extend{

    $this->PEAR();

    ...
}



假如需求,界说你的析构函数 _your_pear_extend
假如需求,从PEAR_Error派生出你本人的毛病处置类
设置你的毛病处置形式,并在恰当的时分触发毛病。
在履行能够发生毛病的代码后,用PEAR::isError($obj)捕捉响应的毛病。
完成你本人的功效。
在最新的PHP4.05的PEAR中心宣布里,已有很多优异的使用模块了,好比:PHPDoc,Cache,HTML...固然,相对CPAN来讲,PEAR只是方才起步,需求PHP社区的人们的通力合作,来完美它,加强它,PHP才会愈来愈壮大。

相干资本
Pear主页

PHP主页

PHPDoc主页,可以从你的PEAR使用源码发生相似JAVADOC的API文档

PHP-Mode for XEmacs/Emacs,为emacs/xemacs供应php的语法撑持,可以很好撑持pear代码作风

Vim主页,十分优异的一个编纂器,对php的撑持也很好

作者简介
潘凡(Night Sailer):北京赛迪网信息手艺无限公司。次要从事是数据的剖析和转换,和相干的开辟任务。善于利用VB,PERL,PHP停止开辟和Linux的中文明任务。近期乐趣是Perl,Php与XML的使用,PHP的MVC开辟形式,PERL-GTK的利用。您可以经由过程 E-mail:nightsailer@hotmail.com跟他接洽。
  熟悉了PHP和MYSQL开发的要领之后,再回头看你写的那个留言本,你也许会怀疑那真的是你写的吗?当然,如果屋里还有鬼的话,也许是它写的-_-
作者: 金色的骷髅    时间: 2015-2-16 04:50
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 不帅    时间: 2015-2-16 04:50
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: admin    时间: 2015-2-25 14:22
爱上php,他也会爱上你。
作者: 精灵巫婆    时间: 2015-3-1 20:43
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 山那边是海    时间: 2015-3-8 11:11
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 飘飘悠悠    时间: 2015-3-11 18:38
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 谁可相欹    时间: 2015-3-15 14:34
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 活着的死人    时间: 2015-3-17 02:07
做为1门年轻的语言,php一直很努力。
作者: 第二个灵魂    时间: 2015-3-23 13:05
本文当是我的笔记啦,遇到的问题随时填充
作者: 深爱那片海    时间: 2015-3-27 20:09
兴趣是最好的老师,百度是最好的词典。
作者: 简单生活    时间: 2015-4-2 12:40
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 小女巫    时间: 2015-4-13 02:56
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 透明    时间: 2015-4-25 02:11
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 冷月葬花魂    时间: 2015-5-3 19:31
实践是检验自己会不会的真理。
作者: 乐观    时间: 2015-5-4 07:30
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 再现理想    时间: 2015-7-11 22:27
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 愤怒的大鸟    时间: 2015-7-20 04:48
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 莫相离    时间: 2015-7-23 00:09
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 小妖女    时间: 2015-10-6 11:54
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2