이 글은 PHP의 보물 디렉토리인 PEAR를 소개합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
당신은 이미 PHP 베테랑이고 훌륭한 코드를 많이 작성했을 수도 있습니다. 그런데 지금 현재 프로젝트에 추가하고 싶다면 좀 어렵겠죠? 당신의 친구는 당신의 코드를 자신의 프로젝트에서 모듈로 사용하고 싶어하지만 당신은 완전히 다른 코딩 스타일을 사용하고 있다는 것을 알게 되었습니다.
저를 따라 PEAR 표준을 사용하여 PHP 프로그램을 작성하시면 귀하의 프로그램과 코드가 다른 전문가의 코드와 쉽게 통합될 것입니다. 더 높은 에너지를 생성하기 위해
PEAR란 무엇인가요?
PEAR는 PHP Extension and Application Repository의 약어입니다. PEAR는 PHP 확장 및 애플리케이션을 위한 코드 저장소입니다. 간단히 말해서 PEAR는 PHP의 CPAN입니다.
PEAR를 사용하는 이유는 무엇인가요?
PHP는 간결하고 효율적인 매우 뛰어난 스크립트 언어입니다. 4.0이 출시되면서 점점 더 많은 사람들이 동적 웹사이트를 개발하는 데 PHP를 사용하고 있습니다. 특히 이러한 언어를 위한 최고의 인터넷 개발 언어 중 하나가 되었다고 할 수 있습니다. 중소 규모의 상용 애플리케이션을 빠르고 효율적으로 개발할 수 있어야 하는 웹사이트 개발자가 선호하는 언어는 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개의 클래스를 제공하여 프레임워크를 구축합니다. 이러한 기능은 상속을 통해 사용할 수 있습니다.
PERR PEAR 코딩 규칙
PEAR 코딩 규칙에는 들여쓰기 규칙, 제어 구조, 함수 호출, 함수 정의, 주석, 포함 코드, PHP 태그, 파일 헤더의 주석 블록, CVS 태그, URL 샘플, 상수 이름 지정 등이 포함됩니다. 11 상들. 다음은 간략한 소개입니다:
들여쓰기 규칙:
PEAR는 코드를 들여쓰기 위해 4개의 공백을 사용해야 하며 TAB은 사용되지 않습니다. VIM을 사용하는 경우 ~/.vimrc에 다음 설정을 지정하세요.
setexpandtab
setshiftwidth=4
set tabstop=4
Emacs/XEmacs를 사용하는 경우 indent-tabs-mode를 nil로 설정해야 합니다. .
하지만 저처럼 (X)Emacs를 사용하여 PHP 파일을 편집하고 싶다면 PEAR 코드를 작성할 때 들여쓰기 스타일이 자동으로 조정되도록 PHP-MODE를 설치하는 것이 좋습니다. 또한 많은 훌륭한 기능이 있으며 리소스 목록에서 최신 버전의 PHP-MODE를 다운로드할 수 있습니다.
제어 구조:
여기에 언급된 제어 구조에는 while 스위치 등이 포함됩니다. 제어 구조의 경우 키워드(예: if for ..) 뒤에 공백이 있어야 하고 제어 괄호 뒤에 있어야 함수 호출과 혼동되지 않습니다. 또한 중괄호 {}를 사용해야 합니다. 구문상 선택사항이더라도 최대한 완벽하게. 이렇게 하면 나중에 새로운 코드 줄을 추가해야 할 때 논리적 혼란이나 오류를 방지할 수 있습니다. 예는 다음과 같습니다.
if ((condition1) && (condition2)) {
statement1;
}esleif ((condition3)
(condition4)) {
statement2; 함수 호출:
함수 호출의 경우 함수 이름과 여는 대괄호( (, 함수 매개변수의 경우 구분하는 쉼표와 다음 매개변수 사이에 동일한 공백 구분이 있어야 하며 마지막으로 매개변수와 오른쪽 대괄호 사이의 공백은 다음과 같습니다.
$result = foo($param1, $param2, $param3);
$result=foo ($param1, $param2,$ param3);
$result=foo( $param1,$param2, $param3 );
또한 함수의 반환 결과에 값을 할당하려면 등호와 할당된 변수 공백이 있어야 하며, 일련의 관련 할당문인 경우 다음과 같이 적절한 공백을 추가하여 정렬합니다.
$result1 = $foo($param1, $param2, $param3); foo($param3);
$var3 = $foo($param4, $param5);함수 정의:
함수 정의는 "하나의 참 중괄호" 규칙을 따릅니다.
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; }
위에 표시된 것처럼 선택적 매개변수는 매개변수 목록 끝에 있어야 하며 항상 의미 있는 함수 값을 반환하도록 노력해야 합니다.
댓글에 관하여:
클래스의 온라인 문서화를 위해서는 JavaDoc과 마찬가지로 PHPDoc으로 변환할 수 있어야 합니다. PHPDoc은 PEAR 애플리케이션이기도 합니다. 더 자세한 소개를 보려면 http://www.phpdoc.de/로 이동하여 볼 수 있습니다. 클래스에 대한 온라인 문서 외에도 문서화되지 않은 주석을 사용하여 코드를 설명하는 것이 좋습니다. 코드를 보면 다음과 같은 생각이 들 것입니다. . 그런 다음 이 코드가 어떻게 작동하는지 잊지 않도록 간단한 설명을 제공하는 것이 좋습니다. 주석 형식의 경우 C의 /* */ 및 C++의 // 둘 다 좋지만 Perl이나 쉘의 # 주석 방법을 사용하지 마십시오.
포함 코드:
클래스 파일을 무조건 포함해야 하는 경우 require_once를 사용해야 합니다. 클래스 파일을 조건부로 포함해야 하는 경우 include_once를 사용해야 합니다. 이렇게 하면 포함하려는 파일이 한 번만 포함됩니다. 이 두 문은 동일한 파일 목록을 공유하므로 두 문이 혼동되는 것에 대해 걱정할 필요가 없습니다. require_once에 파일이 포함되면 include_once는 동일한 파일을 다시 포함하지 않으며 그 반대의 경우도 마찬가지입니다.
PHP 코드 마크업:
단순히 ?>를 사용하는 대신 항상 를 사용하여 PEAR 호환성을 보장하고 크로스 플랫폼 개발에도 도움이 됩니다.
파일 헤더의 주석문:
PEAR 코어 릴리스에 포함되어야 하는 모든 PHP 코드 파일의 경우 파일 시작 부분에 다음 주석문을 추가해야 합니다:
/* vim: set Expandtab tabstop=4 Shiftwidth=4: * /
// +----------------------------------------- ----------- -------------+
// PHP 버전 4.0
/ / +--------- ------------- ----------- -----------+
// | 저작권 (c) 1997, 1998, 1999, 2000, 2001 PHP 그룹
// + ----------- -------------------------- ----------- ---------+
// 이 소스 파일에는 함께 제공되는 PHP 라이센스 버전 2.0이 적용됩니다. | LICENSE 파일에 포함되어 있으며
// | http://www.php.net/license/2_02.txt/에서 | / | PHP 라이센스 사본을 받지 못했고 월드와이드 웹을 통해 | 즉시 사본을 보내드릴 수 있습니다.
// +-------------------------------------- -------------- ----------+
// 저자: 원저자
// | 당신의 이름 |
// +--- ----------------------- -------------- -----+
//
// $Id$
다음과 같은 파일의 경우 PEAR 핵심 코드 베이스에 없으면 파일 시작 부분에도 넣는 것이 좋습니다. 저작권, 라이센스, 작성자 등을 나타내는 이와 유사한 주석 블록이 있습니다. 동시에 첫 번째 줄에 VIM의 MODELINE을 추가하면 VIM에서도 PEAR의 코드 스타일이 유지될 수 있습니다.
CVS 태그:
위와 같이 각 파일에 CVS ID 태그를 추가하세요. 편집하거나 수정하는 파일에 이 태그가 없으면 추가하거나 원본 파일에 유사한 표현으로 바꿔주세요. "최종 수정" 등)
URL 샘플:
RFC 2606을 참조하고 모든 URL 샘플로 "www.example.com"을 사용할 수 있습니다.
상수 이름 지정:
상수는 최대한 대문자로 작성해야 하며, 이해하기 쉽도록 각 단어를 구분하는 데 밑줄을 사용하세요. 동시에 상수가 위치한 패키지 이름이나 클래스 이름을 앞에 붙여야 합니다. 예를 들어 Bug 클래스의 상수는 Bug_로 시작해야 합니다. 위 내용은 PEAR의 코딩 규칙입니다. 자세한 코딩 규칙은 PEAR의 CODING_STANDDARD 파일 설명을 참조하세요. 이러한 코딩 규칙을 더 잘 이해하려면 기존 PEAR 코어 모듈의 코드를 참조할 수도 있습니다.
PEAR 사용 시작하기
물론 위에서 언급한 PEAR 코딩 규칙을 준수해야 클래스 내에서 원하는 것을 구현할 수 있습니다. 다음으로 이에 대해 논의해 보겠습니다. 실제로 PEAR는 사전 정의된 클래스 2개를 제공합니다.
PEAR: 이는 PEAR의 기본 클래스이며 모든 PEAR 확장은 이 클래스에서 상속 및 파생되어야 합니다.
PEAR_Error: PEAR의 오류 처리 기본 클래스로, 자신만의 오류 처리 클래스를 파생하도록 선택할 수 있습니다.
일반적으로 PEAR 인스턴스를 직접 생성하는 것이 아니라 직접 새 클래스를 파생시킨 다음 이 새 클래스의 인스턴스를 생성해야 합니다. 기본 클래스로서 PEAR는 몇 가지 유용한 기능을 제공하며 가장 중요한 기능은 소멸자와 오류 처리
Destructor
입니다.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才会越来越强大。
위 내용은 PHP의 보물창고 디렉토리 PEAR의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!