Maison php教程 php手册 PHP5 OOP编程中的代理与异常定制

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

Jun 13, 2016 am 10:33 AM
oop php5 un et 代理 定制 对象 异常 nous 模仿 Maintenant de 简单 编程

一、 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);
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le dernier chef-d'œuvre du MIT : utiliser GPT-3.5 pour résoudre le problème de la détection des anomalies des séries chronologiques Le dernier chef-d'œuvre du MIT : utiliser GPT-3.5 pour résoudre le problème de la détection des anomalies des séries chronologiques Jun 08, 2024 pm 06:09 PM

Aujourd'hui, j'aimerais vous présenter un article publié par le MIT la semaine dernière, utilisant GPT-3.5-turbo pour résoudre le problème de la détection des anomalies des séries chronologiques et vérifiant dans un premier temps l'efficacité du LLM dans la détection des anomalies des séries chronologiques. Il n'y a pas de réglage fin dans l'ensemble du processus et GPT-3.5-turbo est utilisé directement pour la détection des anomalies. Le cœur de cet article est de savoir comment convertir des séries temporelles en entrées pouvant être reconnues par GPT-3.5-turbo et comment concevoir. des invites ou des pipelines pour laisser LLM résoudre la tâche de détection des anomalies. Permettez-moi de vous présenter une introduction détaillée à ce travail. Titre de l'article image : Largelangagemodelscanbezero-shotanomalydete

Exceptions de fonctions C++ et tests uniques : garantir la solidité du code Exceptions de fonctions C++ et tests uniques : garantir la solidité du code May 03, 2024 am 09:18 AM

La gestion des exceptions et les tests unitaires sont des pratiques importantes pour garantir la solidité du code C++. Les exceptions sont gérées via des blocs try-catch, et lorsque le code lève une exception, il passe au bloc catch. Les tests unitaires isolent les tests de code pour vérifier que la gestion des exceptions fonctionne comme prévu dans différentes circonstances. Cas pratique : La fonction sumArray calcule la somme des éléments du tableau et lève une exception pour gérer un tableau d'entrée vide. Les tests unitaires vérifient le comportement attendu d'une fonction dans des circonstances anormales, comme le lancement d'une exception std::invalid_argument lorsqu'un tableau est vide. Conclusion : en tirant parti de la gestion des exceptions et des tests unitaires, nous pouvons gérer les exceptions, empêcher le code de planter et garantir que le code se comporte comme prévu dans des conditions anormales.

Exception de fonction C++ avancée : gestion personnalisée des erreurs Exception de fonction C++ avancée : gestion personnalisée des erreurs May 01, 2024 pm 06:39 PM

La gestion des exceptions en C++ peut être améliorée grâce à des classes d'exceptions personnalisées qui fournissent des messages d'erreur spécifiques, des informations contextuelles et effectuent des actions personnalisées en fonction du type d'erreur. Définissez une classe d'exception héritée de std::exception pour fournir des informations d'erreur spécifiques. Utilisez le mot-clé throw pour lancer une exception personnalisée. Utilisez Dynamic_cast dans un bloc try-catch pour convertir l'exception interceptée en un type d'exception personnalisé. Dans le cas réel, la fonction open_file lève une exception FileNotFoundException. La capture et la gestion de l'exception peuvent fournir un message d'erreur plus spécifique.

Comment implémenter la gestion des exceptions imbriquées en C++ ? Comment implémenter la gestion des exceptions imbriquées en C++ ? Jun 05, 2024 pm 09:15 PM

La gestion des exceptions imbriquées est implémentée en C++ via des blocs try-catch imbriqués, permettant de déclencher de nouvelles exceptions dans le gestionnaire d'exceptions. Les étapes try-catch imbriquées sont les suivantes : 1. Le bloc try-catch externe gère toutes les exceptions, y compris celles levées par le gestionnaire d'exceptions interne. 2. Le bloc try-catch interne gère des types spécifiques d'exceptions, et si une exception hors de portée se produit, le contrôle est confié au gestionnaire d'exceptions externe.

La clé du codage : libérer la puissance de Python pour les débutants La clé du codage : libérer la puissance de Python pour les débutants Oct 11, 2024 pm 12:17 PM

Python est un langage d'introduction à la programmation idéal pour les débutants grâce à sa facilité d'apprentissage et ses fonctionnalités puissantes. Ses bases incluent : Variables : utilisées pour stocker des données (nombres, chaînes, listes, etc.). Type de données : Définit le type de données dans la variable (entier, virgule flottante, etc.). Opérateurs : utilisés pour les opérations mathématiques et les comparaisons. Flux de contrôle : contrôlez le flux d'exécution du code (instructions conditionnelles, boucles).

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Jun 01, 2024 pm 10:26 PM

Les énigmes de programmation C++ couvrent les concepts d'algorithme et de structure de données tels que la séquence de Fibonacci, la factorielle, la distance de Hamming, les valeurs maximales et minimales des tableaux, etc. En résolvant ces énigmes, vous pouvez consolider vos connaissances en C++ et améliorer la compréhension des algorithmes et vos compétences en programmation.

Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Démystifier C : un chemin clair et simple pour les nouveaux programmeurs Oct 11, 2024 pm 10:47 PM

C est un choix idéal pour les débutants qui souhaitent apprendre la programmation système. Il contient les composants suivants : fichiers d'en-tête, fonctions et fonctions principales. Un simple programme C capable d'imprimer "HelloWorld" a besoin d'un fichier d'en-tête contenant la déclaration de fonction d'entrée/sortie standard et utilise la fonction printf dans la fonction principale pour imprimer. Les programmes C peuvent être compilés et exécutés à l'aide du compilateur GCC. Après avoir maîtrisé les bases, vous pouvez passer à des sujets tels que les types de données, les fonctions, les tableaux et la gestion des fichiers pour devenir un programmeur C compétent.

See all articles