[Modern PHP] 第二章 新特性之二 基于接口的编程
基于接口的编程
作为一个PHP程序员,学习如何基于接口进行编程改变了我的人生,大大提升了我通过集成第三方PHP组件来完善我的项目的能力。接口并不是新的功能,但是它却是你日常工作中必须了解和使用的重要特性。
那么PHP的接口到底是什么?接口是两个PHP对象之间的契约,一个对象调用另一个对象时并不需要知道对方是什么,而只需要知道对方能做什么。接口可以降低我们代码依赖关系的耦合性,允许我们的代码调用任何实现了期望接口的第三方代码。我们只需要关心第三方的代码是否实现了接口就行,而根本不用关心第三方代码是如何实现这些接口的。我们来看一个现实中的例子。
假设我到佛罗里达的迈阿密参加Sunshine PHP开发者大会。我想去城里逛逛,所以我直接去了当地的汽车租赁公司。他们有一辆现代紧凑型的小车,一辆斯巴鲁的旅行车和一辆布加迪威龙(太让我惊讶了)。我知道我只是想借助某个交通工具去城里逛逛,这三辆车都可以满足我的需求。但是每辆车又是那么的与众不同。现代雅绅特还不错啦,但是我喜欢更有活力一点的。我没有孩子,所以旅行车还是大了点。那么,好吧就选布加迪好了。
现实是,我驾驶这三辆车中的任意一辆都可以,因为它们都共享了公用的、已知的接口。每辆车都有一个方向盘、一个油门踏板、一个刹车踏板和转向灯,每辆车都使用汽油作为燃料。但是布加迪的动力强大到我都无法驾驭,但是现代车的驾驶接口却和它一模一样。因为三辆车都共享了同样的已知的接口,但我有机会可以选择我更喜欢的车型(实话实话,最终我可能还是会选择现代)。
在PHP的面向对象方面也有同样的概念。如果我的代码中使用了某个特定的类(代表了特定的实现)的对象,那么我的代码的功能也固然变得非常有限,因为它只能永远使用那个类的对象。然而,如果我的代码将要用到的是一个接口,我的代码立刻就能知道如何去使用任何实现了这个接口的对象。我的代码根本不用关心接口是如何实现的,我的代码只关心对象是否实现了接口,让我们用一个例子把这一切解释清楚。
假设我们有一个PHP类名叫DocumentStore可以从不同的数据源中获取数据,它可以从一个远程的地址中获取HTML,也可以从文档流中读取数据,还可以获取终端的命令行输出。每个保存在DocumentStore实例中的文档都有一个唯一的ID。例子 2-6 展示了DocumentStore类。
例子 2-6 DocumentStore类的定义
class DocumentStore { protected $data = []; public function addDocument(Documentable $document) { $key = $document->getId(); $value = $document->getContent(); $this->data[$key] = $value; } public function getDocuments() { return $this->data; } }
如果addDocument方法只接收Documentable类的实例作为参数怎么才能实现前面描述的功能?很好的观察力。实际上Documentable不是一个类,而是一个接口,看看例子 2-7里接口的定义
例子 2-7 Documentable接口的定义
interface Documentable { public function getId(); public function getContent(); }
在接口的定义中我们能看到任何实现了Documentable接口的对象都必须定义一个public的getId()方法和一个public的getContent()方法。
那么这样做的好处是什么?好处是我们可以分别构造多个功能迥异的文档获取类。例子 2-8展示了一个通过curl从远程地址获取HTML的接口实现。
例子 2-8 HtmlDocument类的定义
<?php class HtmlDocument implements Documentable { protected $url; public function __construct($url) { $this->url = $url; } public function getId() { return $this->url; } public function getContent() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); $html = curl_exec($ch); curl_close($ch); return $html; } }
另一个实现(例子 2-9)可以读取给定资源中的数据流。
例子 2-9 StreamDocument类的定义
<?php class StreamDocument implements Documentable { protected $resource; protected $buffer; public function __construct($resource, $buffer = 4096) { $this->resource = $resource; $this->buffer = $buffer; } public function getId() { return 'resource-' . (int)$this->resource; } public function getContent() { $streamContent = ''; rewind($this->resource); while (feof($this->resource) === false) { $streamContent .= fread($this->resource, $this->buffer); } return $streamContent; } }
最后一个实现(例子 2-10)可以执行一个终端的命令并获取执行结果
例子 2-10 CommandOutputDocument类的定义
<?php class CommandOutputDocument implements Documentable { protected $command; public function __construct($command) { $this->command = $command; } public function getId() { return $this->command; } public function getContent() { return shell_exec($this->command); } }
例子 2-11 展示了我们如何使用DocumentStore类来操作我们实现了Documentable接口的三个文档收集类
例子 2-11 DocumentStore
<?php $documentStore = new DocumentStore(); // Add HTML document $htmlDoc = new HtmlDocument('http://php.net'); $documentStore->addDocument($htmlDoc); // Add stream document $streamDoc = new StreamDocument(fopen('stream.txt', 'rb')); $documentStore->addDocument($streamDoc); // Add terminal command document $cmdDoc = new CommandOutputDocument('cat /etc/hosts'); $documentStore->addDocument($cmdDoc); print_r($documentStore->getDocuments());
这样做最大的亮点在于HtmlDocument、StreamDocument和CommandOutputDocument类除了接口一致外其它方面完全不同。
时至今日,对接口进行编程创造出了更灵活的代码,我们不再关心具体的实现,而是将这些工作交给其他人来完成。越来越多的人(譬如你的同事,你的开源项目的用户,或者你从来都没有见过面的开发者)可以写出与你能够彼此无缝对接的代码,而他们仅仅只需要了解接口即可。
以上就介绍了[Modern PHP] 第二章 新特性之二 基于接口的编程,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Fonction signifie fonction. Il s'agit d'un bloc de code réutilisable avec des fonctions spécifiques. C'est l'un des composants de base d'un programme. Il peut accepter des paramètres d'entrée, effectuer des opérations spécifiques et renvoyer des résultats. code pour améliorer la réutilisabilité et la maintenabilité du code.

Chaque année, avant qu'Apple ne publie une nouvelle version majeure d'iOS et de macOS, les utilisateurs peuvent télécharger la version bêta plusieurs mois à l'avance pour en faire l'expérience en premier. Étant donné que le logiciel est utilisé à la fois par le public et par les développeurs, Apple a lancé des versions développeur et publique, qui sont des versions bêta publiques des versions bêta développeur, pour les deux. Quelle est la différence entre la version développeur et la version publique d’iOS ? Littéralement parlant, la version développeur est une version bêta développeur et la version publique est une version bêta publique. La version développeur et la version publique ciblent des publics différents. La version développeur est utilisée par Apple pour les tests par les développeurs. Vous avez besoin d'un compte développeur Apple pour la télécharger et la mettre à niveau.

Dans cet article, nous découvrirons la fonction enumerate() et le but de la fonction « enumerate() » en Python. Qu'est-ce que la fonction enumerate() ? La fonction enumerate() de Python accepte une collection de données comme paramètre et renvoie un objet d'énumération. Les objets d'énumération sont renvoyés sous forme de paires clé-valeur. La clé est l'index correspondant à chaque élément, et la valeur est les éléments. Syntaxe enumerate(iterable,start) Paramètres iterable - Les données transmises dans la collection peuvent être renvoyées sous forme d'objet d'énumération, appelé iterablestart - Comme son nom l'indique, l'index de départ de l'objet d'énumération est défini par start. si nous ignorons

Explication détaillée du rôle et de la fonction de la table MySQL.proc MySQL est un système de gestion de bases de données relationnelles populaire. Lorsque les développeurs utilisent MySQL, ils impliquent souvent la création et la gestion de procédures stockées (StoredProcedure). La table MySQL.proc est une table système très importante. Elle stocke les informations relatives à toutes les procédures stockées dans la base de données, y compris le nom, la définition, les paramètres, etc. Dans cet article, nous expliquerons en détail le rôle et les fonctionnalités de la table MySQL.proc

Utilisation et fonction de Vue.use Function Vue est un framework frontal populaire qui fournit de nombreuses fonctionnalités et fonctions utiles. L'une d'elles est la fonction Vue.use, qui nous permet d'utiliser des plugins dans les applications Vue. Cet article présentera l'utilisation et la fonction de la fonction Vue.use et fournira quelques exemples de code. L'utilisation de base de la fonction Vue.use est très simple, il suffit de l'appeler avant que Vue ne soit instanciée, en passant le plugin que vous souhaitez utiliser comme paramètre. Voici un exemple simple : //Introduire et utiliser le plug-in

Un collègue est resté bloqué à cause d'un bug signalé par ce problème de pointage de Vue2 qui a provoqué l'utilisation d'une fonction de flèche, entraînant l'impossibilité d'obtenir les accessoires correspondants. Il ne le savait pas quand je le lui ai présenté, puis j'ai délibérément regardé le groupe de communication front-end. Jusqu'à présent, au moins 70 % des programmeurs front-end ne le comprennent toujours pas. Aujourd'hui, je vais partager avec. vous ce lien. Si tout n'est pas clair Si vous ne l'avez pas encore appris, s'il vous plaît, faites-moi une grande gueule.

L'utilisation de la fonction js est : 1. Déclarer la fonction ; 2. Appeler la fonction ; 3. Paramètres de la fonction ; 5. Fonction anonyme ; 7. Portée de la fonction ;

La méthode file_exists vérifie si un fichier ou un répertoire existe. Il accepte comme argument le chemin du fichier ou du répertoire à vérifier. Voici à quoi il sert : c'est utile lorsque vous avez besoin de savoir si un fichier existe avant de le traiter. De cette façon, lors de la création d'un nouveau fichier, vous pourrez utiliser cette fonction pour savoir si le fichier existe déjà. Syntaxe file_exists($file_path) Paramètres file_path - Définit le chemin du fichier ou du répertoire dont l'existence doit être vérifiée. Requis. Renvoie la méthode file_exists(). Renvoie TrueFalse si le fichier ou le répertoire existe, si le fichier ou le répertoire n'existe pas. Exemple voyons une vérification du fichier "candidate.txt" et même si le fichier
