Utilisez l'injection de dépendances (DI) pour améliorer la testabilité des fonctions personnalisées dans les extensions PHP : créez un conteneur DI et enregistrez les dépendances et les fonctions personnalisées. Utilisez un conteneur DI pour obtenir des dépendances dans une fonction personnalisée. Utilisez des classes fictives pour remplacer les dépendances dans les tests et simplifier les tests.
Développement d'extensions PHP : utilisation de l'injection de dépendances pour améliorer la testabilité des fonctions personnalisées
Introduction
Dans le développement d'extensions PHP, les fonctions personnalisées peuvent améliorer considérablement la fonctionnalité et la flexibilité de l'extension. Cependant, la testabilité de ces fonctions peut souvent constituer un défi. En introduisant l'injection de dépendances (DI), nous pouvons améliorer considérablement la testabilité des fonctions personnalisées, les rendant plus faciles à tester unitairement et d'intégration.
Dependency Injection
DI est un modèle de conception qui transmet les dépendances d'un objet à un objet au lieu de laisser l'objet créer lui-même ces dépendances. Dans notre cas, cela signifie que nous transmettons les dépendances (telles que les connexions à la base de données) à la fonction personnalisée au lieu de laisser la fonction créer elle-même la connexion.
Créer un conteneur injectable
Tout d'abord, nous devons créer un conteneur DI. Dans ce conteneur, nous enregistrerons notre fonction personnalisée et ses dépendances. Vous pouvez utiliser la classe de conteneur d'injection de dépendances intégrée de PHP ou un framework DI tiers.
// 创建 DI 容器 $container = new Container(); // 注册依赖项和自定义函数 $container->set('db', new PDO('mysql:host=localhost;dbname=test', 'root', '')); $container->set('customFunction', function($db) { // 自定义函数使用传递的依赖项 });
Utilisation du conteneur DI
Nous pouvons désormais utiliser le conteneur DI dans des fonctions personnalisées pour obtenir des dépendances.
// 使用 DI 容器获取依赖项 $fn = $container->get('customFunction'); // 调用自定义函数,依赖项将自动传递 $fn->handle();
Exemple pratique
Considérons une fonction personnalisée send_email
qui envoie un e-mail à l'utilisateur. Cette fonction dépend de la classe mailer
, qui fournit la fonctionnalité d'envoi d'e-mails. send_email
,它将电子邮件发送给用户。此函数依赖于 mailer
类,该类提供电子邮件发送功能。
使用 DI 之前
在没有 DI 的情况下,自定义函数将直接创建 mailer
类。这会使测试变得困难,因为我们需要模拟 mailer
类或使用真实的 SMTP 服务器。
// 没有 DI 的自定义函数 function send_email($to, $subject, $message) { $mailer = new Mailer(); $mailer->send($to, $subject, $message); }
使用 DI 之后
使用 DI 后,自定义函数可以从 DI 容器中获取 mailer
依赖项。这使得我们能够在测试中将 mailer
Avant d'utiliser DISans DI, la fonction personnalisée créera directement la classe mailer
. Cela peut rendre les tests difficiles puisque nous devons nous moquer de la classe mailer
ou utiliser un vrai serveur SMTP.
// 使用 DI 的自定义函数 function send_email($to, $subject, $message, $container) { $mailer = $container->get('mailer'); $mailer->send($to, $subject, $message); } // 测试自定义函数 $container = new Container(); $container->set('mailer', new MockMailer()); // 使用模拟类代替 mailer 类 send_email('test@example.com', 'Test Subject', 'Test Message', $container);
mailer
à partir du conteneur DI. Cela nous permet de remplacer mailer
par une classe fictive dans nos tests, ce qui facilite les tests. 🎜rrreee🎜🎜Conclusion🎜🎜En tirant parti de l'injection de dépendances, nous avons pu améliorer considérablement la testabilité de nos fonctions personnalisées. Cela nous permet de remplacer facilement les dépendances dans les tests, rendant les tests plus rapides et plus fiables. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!