L'interface de PHP a été controversée du début à la fin. Certaines personnes disent que l'interface est très bonne, tandis que d'autres disent qu'elle est inutile. Tout d’abord, vous devez comprendre quels sont les critères permettant de juger si quelque chose a bon ou mauvais goût. Sans aucun doute, cela est comparé à Java/C++. Dans l'exemple et la discussion ci-dessus, l'interface PHP est insuffisante dans la « programmation orientée contrat » et ne joue pas le rôle qui lui revient.
En fait, la déclaration de la classe machine doit être devant la classe plain. L'interface fournit un ensemble de spécifications fournies par le système, puis la classe machine fournit un ensemble d'API pour l'interface et les implémente, et enfin la classe personnalisée. En Java, la raison pour laquelle les interfaces sont populaires (interface exécutable multithread, interface de collection de conteneurs, etc.) est que le système effectue les deux premières parties du travail à notre place et que les programmeurs n'ont besoin que d'écrire des classes d'implémentation spécifiques pour garantir que L'interface est disponible et contrôlable.
Pourquoi utiliser des interfaces ? Quels sont les avantages des interfaces ? L'interface elle-même ne fournit pas d'implémentation, seulement une spécification. Si nous savons qu'une classe implémente une interface, alors nous connaissons les méthodes qui peuvent être appelées sur l'interface. Il nous suffit de les connaître.
En PHP, la sémantique des interfaces est limitée, et il n'y a pas beaucoup d'endroits pour utiliser les interfaces. Les interfaces en PHP peuvent être réduites à des documents de conception, qui servent de contrat de base pour l'équipe. suit :
<?php interface Cache { /** * describe:缓存管理,项目经理定义接口,技术人员负责实现 */ const maxKey = 10000; //最大换存量 public function getCache($key); //获取缓存 public function setCache($key,$value); //设置缓存 public function flush(); //清空缓存 }
Étant donné que PHP est faiblement typé et met l'accent sur la flexibilité, il n'est pas recommandé d'utiliser des interfaces à grande échelle. Au lieu de cela, il n'est utilisé que dans certains codes "noyau" en raison des interfaces. en PHP, de nombreuses interfaces devraient avoir une sémantique. D'un point de vue sémantique, vous pouvez utiliser la classe abstraite plus souvent. Quant à la comparaison entre classes abstraites et interfaces, je n’entrerai pas dans les détails.
De plus, PHP5 a apporté de nombreuses améliorations aux fonctionnalités orientées objet Parmi elles se trouve une tentative de SPL (labellisée bibliothèque PHP Certaines interfaces sont implémentées en SPL). dont l'itérateur Iterator Interface, en implémentant cette interface, l'objet peut être utilisé dans la structure foreach, de sorte que le formulaire d'utilisation soit relativement unifié. Par exemple, il existe une classe DirectoryIterator dans SPL. Cette classe intègre la classe SplFileInfo et implémente les trois interfaces Iterator, Traversable et SeekableIterator. Les instances de cette classe peuvent alors obtenir toutes les fonctions de la classe parent. SplFileInfo, et également capable d'implémenter les opérations affichées par l'interface Iterator .
Le prototype de l'interface Iterator est le suivant :
* current() This methodreturns the current index's value. You are solely responsible for tracking what thecurrent index is as the interface does not do this for you. *key() This method returns the value of the current index's key. For foreach loops this is extremely important so that the key value can be populated. *next() This method moves the internal index forward one entry. *rewind() This method should reset the internal index to the first element. *valid() This method should return true or false if there is a current element. It is called after rewind() or next().
Si une classe déclare implémenter Iterator, elle doit implémenter ces cinq méthodes. Si ces cinq méthodes sont implémentées, alors elle peut. être itère facilement sur les instances de cette classe. Ici, la raison pour laquelle la classe DirectoryIterator peut être utilisée est que le système a déjà implémenté l'interface Iterator, elle peut donc être utilisée comme suit :
<?php $dir = new DirectoryIterator(dirname(FILE)); foreach ($dir as $fileInfo) { if(!$fileInfo->isDir()) { echo $fileInfo->getFilename(),"\t",$fileInfo->getSize(),PHP_EOL; } }
Il est concevable que si vous n'utilisez pas la classe DirectoryIterator classe, mais implémentez-le vous-même. Non seulement la quantité de code a augmenté, mais le style de boucle n'est plus uniforme. Si la classe que vous écrivez implémente également l’interface Iterator, elle peut fonctionner comme un Iterator.
Pourquoi l’objet d’une classe peut-il être utilisé comme objet foreach tant qu’il implémente l’Iterator ? En fait, la raison est très simple. Lors de l'utilisation de la syntaxe foreach sur un objet instance PHP, il vérifiera si l'instance implémente l'interface Iterator. Si c'est le cas, l'instruction foreach sera simulée via des méthodes intégrées ou en utilisant des méthodes dans le fichier. Classe d'implémentation.Est-ce la même chose qu'avant ?L'implémentation de la méthode toString mentionnée est-elle similaire ? En fait, la méthode toString est une implémentation déguisée de l'interface. L'interface est comme ça. L'interface elle-même ne fait rien. Le système implémente silencieusement le comportement de l'interface en interne, donc tant que vous implémentez cette interface, vous pouvez utiliser les méthodes fournies par l'interface. C'est l'idée "plug and play" des interfaces
Nous savons tous que les interfaces sont une implémentation déguisée de plusieurs intégrations, et quand nous parlons d'héritage, nous avons mentionné les traits utilisés pour implémenter les mixins, en fait, les traits peut être considéré comme une version améliorée de l’interface.
Regardez le code suivant :
<?php trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'Word'; } } class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
Les résultats du code ci-dessus sont les suivants :
Hello Word!
MyHelloWorld implémente ici deux traits en même temps, afin qu'il puisse appeler les segments de code dans les deux traits respectivement. Comme vous pouvez le voir dans le code, les Traits sont très similaires aux interfaces. La différence est que les Traits peuvent importer des interfaces contenant du code. Dans un sens, les traits et les interfaces sont une implémentation déguisée d'une « intégration multiple ».
Résumer plusieurs concepts sur les interfaces :
Les interfaces existent sous forme de spécification et de contrat. En tant que spécification, l'interface doit garantir la convivialité ; en tant qu'interface contractuelle, elle doit garantir la contrôlabilité,
L'interface n'est qu'une déclaration, et une fois le mot-clé interface utilisé, il doit être mis en œuvre. Il peut être implémenté par le programmeur (interface externe) ou par le système (interface interne). L'interface elle-même ne fait rien, mais elle peut nous dire ce qu'elle peut faire.
Il y a deux défauts dans les interfaces en PHP L'une est qu'il n'y a pas de restrictions contractuelles, et l'autre est qu'il n'y a pas assez d'interfaces internes.
L'interface est en fait très simple, mais les différentes applications de l'interface sont très flexibles. Une grande partie du modèle de conception tourne également autour de l'interface.
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!