首页 > 编程技术 > php

PHP5OOP编程中的代理与异常定制(三)

发布时间:2016-11-25 17:13

现在,你可以实现QueryException类。注重你是如何遍历调用栈以在脚本中查找实际导致错误的位置的。这正好适用于当抛出异常的DBQuery对象是一个继续自DBQuery对象的子类的情况。

  列表5:QueryException类。

/**
*查询异常
*
*当试图执行一个查询时,假如一个错误发生,将由{@link DBQuery}对象抛出错误
*/
class QueryException extends Exception
{
/**
* 查询文本
*
* @var字符串$QueryText;
*/
protected $QueryText;
/**
*来自数据库的错误号/代码
*
* @var字符串$ErrorCode
*/
protected $ErrorNumber;
/**
*来自数据库的错误消息
*
* @var字符串$ErrorMessage
*/
protected $ErrorMessage;
/**
*类构造器
*
* @参数:DBQuery $db,是抛出异常的查询对象
*/
public function __construct(DBQuery $query)
{
 /*得到调用栈*/
 $backtrace = $this->GetTrace();
 /*把行和文件设置到错误实际发生的位置*/
 if (count($backtrace) > 0) {
  $x = 1;
  /*假如查询类被继续,那么我们需要忽略由子类所进行的调用*/
  while((! isset($backtrace[$x]['line'])) ||
(isset($backtrace[$x]['class']) && is_subclass_of($backtrace[$x]['class'], 'DBQuery')) ||
(strpos(strtolower(@$backtrace[$x]['function']), 'call_user_func')) !== false ) {
   /*循环执行,只要没有行号或调用的函数是DBQuery类的一个子类*/
    $x;
   /*假如我们到达栈底,那么我们使用第一个调用者*/
   if (($x) >= count($backtrace)) {
    $x = count($backtrace);
    break;
   }
 }
 /*假如上面的循环至少执行一次,那么我们可以把它减1以查找实际的引起错误的代码行
 */
 if ($x != 1) {
  $x -= 1;

四、 使用继续抛出定制异常

  在PHP中,你可以抛出任何对象作为一个异常;但是,首先该异常应该继续自PHP的内置异常类。通过创建你自己的定制异常,你可以记录其它有关于该错误的信息,例如在一个日志文件中创建一个入口,或做你喜欢做的任何事情。你的定制异常将要做如下几件事情:

一. 10句话
1.不要依靠register_global=ON的环境,从你刚懂得配置php运行环境甚至尚不明白register_global的ON/OFF会对自己有什么影响的那天起,就应该勇敢地把它设为OFF.
2.写程序前看看怎么用error_reporting.
3.不懂就问本身没错,但你需要在那之前查查手册。
4.当然,你需要懂得使用手册。手册上找不到答案的时候,应该考虑下网络上的搜索引擎。
5.刚学会php mysql之后,不要叫嚷着要写论坛,要写XXX。要明白,刚学会写汉字并不表示你有能力写诗。
6.在学web编程的时候,你应该先去熟悉html这个朋友。
7.有点能力后,试着回答新手的问题,不要看到自己懂的而别人不懂就沾沾自喜,扔下一名“简单,那是基本的东西”就走更要不得。
8.思考是一个好习惯,不动手去写就等于空想,什么也没有。
9.写好一段程序,假如觉得很满足,一周后再看一遍,也许你会认为它应该有所改变
10.有空多看看别人的程序,找出他人的不足或优点,自己掂量。

二. 各取所需

1.善于使用“引用”,它能直接影响到程序的效率。

2.善于用三元运算子,可以让程式较精简有效率。
比如:

PHP代码:

if ($data[$i]['nickname']){
$nickname = $data[$i]['nickname'];
}
else{
$nickname = $data[$i]['ip'];
}
可以写成:

PHP代码:

$nickname = $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];
3.善于组织if...else...回圈
比如:

PHP代码:

$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
if (!empty($type))
{
if (!strpos($type, $ext_name))
{
echo "Please upload the file of $type form.";
exit();
}
}
上面的代码你应该写成这样:

PHP代码:

综述
  Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
  一般来说,在网站上某一个页面中的变量(指服务器端变量,下同)是不能在下一页中用的,有了session就好办了。session中注册的变量可以作为全局变量使用。这样我们就可以将session用于用户身份认证,程序状态记录,页面之间参数传递。
  在PHP3版本中是如何实现session的?
  php3本身是没有实现session功能的,我们只有用其他的方法来实现,这其中最有名的要算phplib了。phplib最基本的功能包括用户认证、Session管理、权限及数据库的抽象化。下面我们就讲述一下如何用phplib实现session。
  1、首先安装phplib(环境为win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21 for win32)
  首先将phplib解开,里面有一个"php"目录,将这个目录拷贝到Apache的安装目录下。例如:Apache安装在d:Apache 目录下,那么就将"php"目录拷贝到d:Apache,并将phplib目录的pages目录下(不包括目录本身)的文件和目录一起拷贝到d:Apachehtdocs下。
  phplib的类库需要根据系统进行初始化,可能需要修改local.inc文件,其中包含着一些基本参数,可以根据自己机器的实际情况来进行修改。
  将d:Apachephpprepend.php文件中的一段程序改为如下样子:
    if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
      $_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下php目录的路径
    }
  修改d:Apachephplocal.inc文件:
    class DB_Example extends DB_Sql {
      var $Host = "localhost"; //mysql数据库所在主机名
      var $Database = "test"; //数据库名
      var $User = "root"; //数据库用户名
      var $Password = "1234567"; //数据库用户密码
    }
  最后根据phplib目录下的stuff子目录中的create_database.mysql文件生成初始表。
  由于每一个使用phplib的页面首先必须可以找到运行phplib所必需的类库文件,我们可以在php.ini中设置auto_prepend变量来支持,phplib中包含一个prepend.php文件,并将auto_prepend指定为"d:/Apache/php/prepend.php"(带引号)后,各页面就会自动包含phplib类库,我们还可以将phplib类库所在目录加进include变量中,以便可以找到这些文件。
PHP的面向对象编程:开发大型PHP项目的方法(一)
作者:Luis Argerich 译者:limodou
  这篇文章介绍了在PHP中的面向对象编程(OOP,Object Oriented Programming)。我将向你演示如何通
过使用一些OOP的概念和PHP的技巧来减少编码和提高质量。祝你好运!
  面向对象编程的概念:
  不同的作者之间说法可能不一样,但是一个OOP语言必须有以下几方面:
抽象数据类型和信息封装
继承
多态
  在PHP中是通过类来完成封装的:
--------------------------------------------------------------------------------<?php
class Something {
// 在OOP类中,通常第一个字符为大写
var $x;
function setX($v) {
// 方法开始为小写单词,然后使用大写字母来分隔单词,例如getValueOfArea()
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>--------------------------------------------------------------------------------
  当然你可以按自已的喜好进行定义,但最好保持一种标准,这样会更有效。
  数据成员在类中使用"var"声明来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可
以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象。
  方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使用$this->name,否则对一个方
法来说,它只能是局部变量。
  使用new操作符来创建一个对象:
  $obj=new Something;
  然后你可以使用成员函数通过:
  $obj->setX(5);
  $see=$obj->getX();
  在这个例子中,setX成员函数将5赋值给对象的成员变量x(不是类的),然后getX返回它的值5。
  你可以象:$obj->x=6那样通过类引用方式来存取数据成员,这不是一个很好的OOP习惯。我强烈建议通
过方法来存取成员变量。如果你把成员变量看成是不可处理的,并且只通过对象句柄来使用方法,你将是一
个好的OOP程序员。不幸的是,PHP不支持声明私有成员变量,所以不良代码在PHP中也是允许的。
  继承在PHP中很容易实现,只要使用extend关键字。
--------------------------------------------------------------------------------
<?php
class Another extends Something {
var $y;
function setY($v) {
$this->y=$v;
}
function getY() {
return $this->y;
}
}
?>--------------------------------------------------------------------------------
转自PHPBuilder.com

标签:[!--infotagslink--]

您可能感兴趣的文章: