案例展示 Case demonstration

秒速赛车客服


秒速赛车PHP5 OOP编程之代理与定制异常

周期:

服务内容:

简介:即使盘问腐化,你需求转化你的execute函数以扔出一个特地。你将扔出一个称为QueryException的定制特地对象导致过错的DBQuery对象被传达给它。 4.还应当参加一个函数它取得现在的与DBQue

关键词:秒速赛车

网站:

  即使盘问腐化,你需求转化你的execute函数以扔出一个特地。你将扔出一个称为QueryException的定制特地对象导致过错的DBQuery对象被传达给它。

  4.还应当参加一个函数它取得现在的与DBQuery对象闭连联的DB对象。

  execute语句不再返回一个结果资源,现正在它返回DBQuery对象自己。

  /*提防现正在咱们何如返回对象自己,这使咱们或许从这个函数的返回结果中挪用成员函数

  正在PHP中,你可能扔出任何对象举动一个特地;然而,最初该特地应当承担自PHP的内置特地类。通过创筑你本身的定制特地,你可能纪录其它相闭于该过错的音信,比如正在一个日记文献中创筑一个入口,或做你喜爱做的任何事变。你的定制特地将要做如下几件事变:

  每个函数的竣工相当简便。它首优秀行查抄,以确保仍旧实践盘问,然后把劳动代劳到DB对象,返回它的结果就好象它是盘问对象自己(称作是根基数据库函数)相同。

  *当试图实践一个盘问时,即使一个过错产生,将由{@linkDBQuery}对象扔出过错

  你恐怕仍旧从上面的代码中提防到,你拘捕的是一个称为QueryException(咱们将正在后面竣工这个对象)的特地。一个特地犹如于一个过错,然而却更具有普通性。形容一个特地的最好的手段是运用emergency。尽量一个emergency可能不会是“致命的”,然而依然务必处置它。当正在PHP中扔出一个特地时,实践确当前周围很疾地被终止,不管它是一个函数,try..catch块依然剧本自己。然后,该特地遍历挪用栈终止每个实践周围,直到或者正在一个try..catch块中拘捕它或者它抵达挪用栈的顶部此时它将天生一个致命过错。

  正在本文中,你看到了代劳是奈何把与盘问相相闭的DB接口映照到针对一个特定的盘问结果上的操作。DBQuery对象宣泄一样的函数,比如fetch_assoc(),举动DB对象。然而,这些都是针对单个盘问起效用。你还进修了何如运用定制特地来给出周到音信一个过错产生正在何时何地,以及它们奈何更好地驾驭过错的处置。

  特地处置是PHP5中的其它一个新特色,当与OOP联用时,它或许竣工优越地驾驭过错处置和陈说。一个try..catch块是一种处置特地的紧要机制。一朝被拘捕,剧本将会从特地被拘捕和被处置的代码的下一行不断实践。

  即使盘问实践腐化,它扔出一个QueryException类型的特地。当被转换成一个字符串时,它将返回产生的过错的细节音信。

  现正在,你可能竣工QueryException类。提防你是何如遍历挪用栈以正在剧本中查找本质导致过错的身分的。这正好合用于当扔出特地的DBQuery对象是一个承担自DBQuery对象的子类的情状。

  显示过错音尘和盘问文本当被转换成一个字符串时。

  为此,你需求运用代劳。毕竟上,你正在咱们的DBQuery对象中仍旧运用代劳了,然而现正在将更为长远地运用它来把它与MySqlDB对象慎密绑定。该DBQuery对象仍旧被运用一个竣工DB接口的对象初始化,而且它仍旧包蕴一个成员函数execute由它挪用DB对象的query()手段来实践该盘问。这个DBQuery对象自己并不本质地盘问数据库,它把这项劳动交由DB对象来达成。这即是代劳,原本是一个过程借助于这个过程,秒速赛车通过把音尘发送给另一个竣工一样的或犹如手脚的对象,一个对象可能竣工一个分外的手脚。

  /*即使上面的轮回起码实践一次,那么咱们可能把它减1以查找本质的惹起过错的代码行

  /*结果,咱们可能成立文献和行号,这应当可能反应出惹起过错的SQL语句*/

  上面编削后的代码中咱们最感意思的是,catch语句和execute语句。

  给出盘问过错产生所熟手代码的切确细节通过查抄挪用栈。

  为了使代劳或许管事,咱们需求确保DBQuery对象的$db变量是一个竣工了DB接口的对象的实例。类型提示是PHP5中的一种新特色,它或许使你把函数参数强制转换成特定类型的对象。正在PHP5之前,独一确实保函数参数是一个特定对象类型的手段是运用PHP中所供应的类型查抄函数(也即是is_a())。现正在,你可能简便地强制转换对象类型通过正在函数参数的前面加上类型名。你仍旧从咱们的DBQuery对象中看到了类型提示,云云可能确保一个竣工DB接口的对象被传达到对象构制器中。

  现正在,咱们的DBQuery对象简便地仿制一个存储流程一朝被实践,即返回一个务必举行存在的结果资源;而且即使你思运用该结果集上的函数(比如num_rows()或fetch_row())的话,你务必传达MySqlDB对象。那么,即使由DBQuery对象来竣工MySqlDB对象(其打算目标是对一个实践盘问的结果举行操作)竣工的函数,结果何如呢?让咱们不断运用上一篇示例中的代码;而且让咱们假定,现正在由DBQuery对象束缚咱们的结果资源。DBQuery类的源码如列外1所示。

  为此,你需求编削DBQuery对象以便蕴涵总共的函数它们操作一个来自DB对象的结果资源。当实践盘问以挪用DB对象的相应函数而且返回它的结果时,你需求运用存储的结果。下列函数将被增加: