백엔드 개발 PHP 튜토리얼 PHP5 OOP编程中的代理与异常定制_PHP教程

PHP5 OOP编程中的代理与异常定制_PHP教程

Jul 13, 2016 pm 05:34 PM
oop php5 하나 그리고 연기 맞춤 제작 물체 이상 우리를 본뜨다 지금 ~의 단순한 프로그램 작성

一、 DBQuery对象

  现在,我们的DBQuery对象简单地模仿一个存储过程—一旦被执行,即返回一个必须进行保存的结果资源;并且如果你想使用该结果集上的函数(例如num_rows()或fetch_row())的话,你必须传递MySqlDB对象。那么,如果由DBQuery对象来实现MySqlDB对象(其设计目的是对一个执行查询的结果进行操作)实现的函数,效果如何呢?让我们继续使用上一篇示例中的代码;并且让我们假定,现在由DBQuery对象管理我们的结果资源。DBQuery类的源码如列表1所示。

  列表1.使用DBQuery类。

require mysql_db.php;
require_once query.php;
$db = new MySqlDb;
$db->connect(host, username, pass);
$db->query(use content_management_system);
$query = new DBQuery($db);
$query->prepare(SELECT fname,sname FROM users WHERE username=:1S AND pword=:2S AND expire_time<:3i> try {
 if($query->execute("visualad", "apron", time()))->num_rows() == 1) {
  echo(Correct Credentials);
 } else {
  echo(Incorrect Credentials / Session Expired);
 }
} catch (QueryException $e) {
 echo(Error executing query: . $e);
}

  上面修改后的代码中我们最感兴趣的是,catch语句和execute语句。

  · execute语句不再返回一个结果资源,现在它返回DBQuery对象本身。

  · DBQuery对象现在实现num_rows()函数—我们从DB接口中已经熟悉。

  · 如果查询执行失败,它抛出一个QueryException类型的异常。当被转换成一个字符串时,它将返回发生的错误的细节信息。

  为此,你需要使用代理。事实上,你在我们的DBQuery对象中已经使用代理了,但是现在将更为深入地使用它来把它与MySqlDB对象紧密绑定。该DBQuery对象已经被使用一个实现DB接口的对象初始化,并且它已经包含一个成员函数execute—由它调用DB对象的query()方法来执行该查询。这个DBQuery对象本身并不实际地查询数据库,它把这项任务交由DB对象来完成。这就是代理,其实是一个进程—借助于这个进程,通过把消息发送给另一个实现相同的或类似行为的对象,一个对象可以实现一个特别的行为。

  为此,你需要修改DBQuery对象以便包括所有的函数—它们操作一个来自DB对象的结果资源。当执行查询以调用DB对象的相应函数并且返回它的结果时,你需要使用存储的结果。下列函数将被添加:

  列表2:使用代理扩展DBQuery类。

class DBQuery
{
 .....

 public function fetch_array()
 {  
  if (! is_resource($this->result)) {
   throw new Exception(Query not executed.);
  }

  return $this->db->fetch_array($this->result);
 }

 public function fetch_row()
 {
  if (! is_resource($this->result)) {
   throw new Exception(Query not executed.);
  }

  return $this->db->fetch_row($this->result);
 }

 public function fetch_assoc()
 {
  if (! is_resource($this->result)) {
   throw new Exception(Query not executed.);
  }

  return $this->db->fetch_assoc($this->result);
 }

 public function fetch_object()
 {
  if (! is_resource($this->result)) {
   throw new Exception(Query not executed.);
  }

  return $this->db->fetch_object($this->result);
 }

 public function num_rows()
 {
  if (! is_resource($this->result)) {
   throw new Exception(Query not executed.);
  }

  return $this->db->num_rows($this->result);
 }
}

  每个函数的实现相当简单。它首先进行检查,以确保已经执行查询,然后把任务代理到DB对象,返回它的结果就好象它是查询对象本身(称作是基本数据库函数)一样。

  二、 类型提示(Type Hinting)

  为了使代理能够工作,我们需要确保DBQuery对象的$db变量是一个实现了DB接口的对象的实例。类型提示是PHP 5中的一种新特征,它能够使你把函数参数强制转换成特定类型的对象。在PHP 5之前,唯一的确保函数参数是一个特定对象类型的方法是使用PHP中所提供的类型检查函数(也即是is_a())。现在,你可以简单地强制转换对象类型—通过在函数参数的前面加上类型名。你已经从我们的DBQuery对象中看到了类型提示,这样可以确保一个实现DB接口的对象被传递到对象构造器中。

public function __construct(DB $db)
{
 $this->db = $db;
}

  当使用类型提示时,你不仅可以指定对象类型,还可以指定抽象类和接口。

  三、 抛出异常

  你可能已经从上面的代码中注意到,你捕获的是一个称为QueryException(我们将在后面实现这个对象)的异常。一个异常类似于一个错误,然而却更具有一般性。描述一个异常的最好的方法是使用emergency。尽管一个emergency可以不会是“致命的”,但是还是必须处理它。当在PHP中抛出一个异常时,执行的当前范围很快地被终止,不管它是一个函数,try..catch块还是脚本本身。然后,该异常遍历调用栈—终止每个执行范围,直到或者在一个try..catch块中捕获它或者它到达调用栈的顶部—此时它将生成一个致命错误。

  异常处理是PHP 5中的另外一个新特征,当与OOP联用时,它能够实现良好地控制错误处理和报告。一个try..catch块是一种处理异常的重要机制。一旦被捕获,脚本将会从异常被捕获和被处理的代码的下一行继续执行。

  如果查询失败,你需要改变你的execute函数以抛出一个异常。你将抛出一个称为QueryException的定制异常对象—导致错误的DBQuery对象被传递给它。

  列表3.抛出一个异常。

/**
*执行当前查询
*
* 执行当前查询—用提供的参数代替任何点位符
* .
*
* @参数: mixed $queryParams,... 查询参数
* @返回:资源A—参考描述执行查询的资源。
*/
public function execute($queryParams = )
{
 //例如: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
 $args = func_get_args();
 if ($this->stored_procedure) {
  /*调用compile函数以得到查询*/
  $query = call_user_func_array(array($this, compile), $args);
 } else {
  /*一个存储过程没被初始化,因此,作为一种标准查询来执行之*/
  $query = $queryParams;
 }
 $result = $this->db->query($query);
 if (! $result) {
  throw new QueryException($this);

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/508484.htmlTechArticle一、 DBQuery对象 现在,我们的DBQuery对象简单地模仿一个存储过程一旦被执行,即返回一个必须进行保存的结果资源;并且如果你想使用该结...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MIT의 최신 걸작: GPT-3.5를 사용하여 시계열 이상 탐지 문제 해결 MIT의 최신 걸작: GPT-3.5를 사용하여 시계열 이상 탐지 문제 해결 Jun 08, 2024 pm 06:09 PM

오늘은 지난 주 MIT에서 발표한 기사를 소개하고자 합니다. GPT-3.5-turbo를 사용하여 시계열 이상 탐지 문제를 해결하고, 시계열 이상 탐지에서 LLM의 효율성을 초기에 검증한 내용입니다. 전체 과정에 미세한 조정은 없으며, 이상 탐지를 위해 GPT-3.5-turbo를 직접 사용하는 것이 이 글의 핵심이다. LLM이 이상 탐지 작업을 해결하도록 하는 프롬프트 또는 파이프라인입니다. 이 작품을 자세히 소개하겠습니다. 이미지 논문 제목: Large Languagemodelscanbezero-shotanomalydete

C++ 함수 예외 및 단일 테스트: 코드 건전성 보장 C++ 함수 예외 및 단일 테스트: 코드 건전성 보장 May 03, 2024 am 09:18 AM

예외 처리 및 단위 테스트는 C++ 코드의 건전성을 보장하는 중요한 방법입니다. 예외는 try-catch 블록을 통해 처리되며, 코드에서 예외가 발생하면 catch 블록으로 이동합니다. 단위 테스트는 코드 테스트를 분리하여 예외 처리가 다양한 상황에서 예상대로 작동하는지 확인합니다. 실제 사례: sumArray 함수는 배열 요소의 합계를 계산하고 빈 입력 배열을 처리하기 위해 예외를 발생시킵니다. 단위 테스트는 배열이 비어 있을 때 std::invalid_argument 예외를 발생시키는 등 비정상적인 상황에서 예상되는 함수 동작을 확인합니다. 결론: 예외 처리 및 단위 테스트를 활용하여 예외를 처리하고, 코드 충돌을 방지하고, 비정상적인 조건에서 코드가 예상대로 작동하는지 확인할 수 있습니다.

C++ 함수 예외 고급: 사용자 정의된 오류 처리 C++ 함수 예외 고급: 사용자 정의된 오류 처리 May 01, 2024 pm 06:39 PM

C++의 예외 처리는 특정 오류 메시지, 상황별 정보를 제공하고 오류 유형에 따라 사용자 지정 작업을 수행하는 사용자 지정 예외 클래스를 통해 향상될 수 있습니다. 특정 오류 정보를 제공하려면 std::Exception에서 상속된 예외 클래스를 정의하세요. 사용자 정의 예외를 발생시키려면 throw 키워드를 사용하십시오. try-catch 블록에서 Dynamic_cast를 사용하여 발견된 예외를 사용자 지정 예외 유형으로 변환합니다. 실제 경우 open_file 함수는 FileNotFoundException 예외를 발생시킵니다. 예외를 포착하고 처리하면 보다 구체적인 오류 메시지가 제공될 수 있습니다.

C++에서 중첩 예외 처리를 구현하는 방법은 무엇입니까? C++에서 중첩 예외 처리를 구현하는 방법은 무엇입니까? Jun 05, 2024 pm 09:15 PM

중첩된 예외 처리는 중첩된 try-catch 블록을 통해 C++에서 구현되므로 예외 처리기 내에서 새 예외가 발생할 수 있습니다. 중첩된 try-catch 단계는 다음과 같습니다. 1. 외부 try-catch 블록은 내부 예외 처리기에서 발생한 예외를 포함하여 모든 예외를 처리합니다. 2. 내부 try-catch 블록은 특정 유형의 예외를 처리하며 범위를 벗어난 예외가 발생하면 외부 예외 처리기에 제어가 제공됩니다.

Python을 사용한 문제 해결: 초보 코더로서 강력한 솔루션 잠금 해제 Python을 사용한 문제 해결: 초보 코더로서 강력한 솔루션 잠금 해제 Oct 11, 2024 pm 08:58 PM

Python은 초보자에게 문제 해결 능력을 부여합니다. 사용자 친화적인 구문, 광범위한 라이브러리 및 변수, 조건문 및 루프 사용 효율적인 코드 개발과 같은 기능을 제공합니다. 데이터 관리에서 프로그램 흐름 제어 및 반복 작업 수행에 이르기까지 Python은 제공합니다.

C++ 프로그래밍 퍼즐 모음: 사고를 자극하고 프로그래밍 기술을 향상시킵니다. C++ 프로그래밍 퍼즐 모음: 사고를 자극하고 프로그래밍 기술을 향상시킵니다. Jun 01, 2024 pm 10:26 PM

C++ 프로그래밍 퍼즐은 피보나치 수열, 계승, 해밍 거리, 배열의 최대값과 최소값 등과 같은 알고리즘 및 데이터 구조 개념을 다룹니다. 이러한 퍼즐을 풀면 C++ 지식을 통합하고 알고리즘 이해 및 프로그래밍 기술을 향상시킬 수 있습니다.

내면의 프로그래머를 깨워보세요: 완전 초보자를 위한 C 내면의 프로그래머를 깨워보세요: 완전 초보자를 위한 C Oct 11, 2024 pm 03:50 PM

C는 초보자가 프로그래밍을 배우기에 이상적인 언어이며 효율성, 다양성 및 이식성이 장점입니다. C 언어를 배우려면 다음이 필요합니다. C 컴파일러 설치(MinGW 또는 Cygwin 등) 변수, 데이터 유형, 조건문 및 루프문 이해 주 함수와 printf() 함수가 포함된 첫 번째 프로그램 작성 실제 사례를 통한 연습(예: 평균 계산) C 언어 지식

코딩의 핵심: 초보자를 위한 Python의 힘 활용 코딩의 핵심: 초보자를 위한 Python의 힘 활용 Oct 11, 2024 pm 12:17 PM

Python은 배우기 쉽고 강력한 기능을 통해 초보자에게 이상적인 프로그래밍 입문 언어입니다. 기본 사항은 다음과 같습니다. 변수: 데이터(숫자, 문자열, 목록 등)를 저장하는 데 사용됩니다. 데이터 유형: 변수의 데이터 유형(정수, 부동 소수점 등)을 정의합니다. 연산자: 수학 연산 및 비교에 사용됩니다. 제어 흐름: 코드 실행(조건문, 루프) 흐름을 제어합니다.

See all articles