首页 » PHP教程 » phpinterface运用场景技巧_PHP 新特点若何善用接口与Trait

phpinterface运用场景技巧_PHP 新特点若何善用接口与Trait

访客 2024-11-12 0

扫一扫用手机浏览

文章目录 [+]

接口不是新特性但是很主要,接口是两个php工具的左券。
其目的不是让一个工具依赖另一个工具的身份,而是依赖另一个工具的能力。
接口把我们的代码和依赖解耦,而且许可我们的代码依赖任何实现了预期接口的第三方代码。
我们不关心第三方代码如何实现接口,只去关心他有没有去实现接口。

如果我们写的类去处理特定的工具, 那么类的功能就被限定了,只能处理那个类。
但是我们的工具如果是处理的接口,那么代码立即就能知道如何处理实现这一接口的任何工具,我们的代码不管接口如何实现只须要关心有没有实现。

phpinterface运用场景技巧_PHP 新特点若何善用接口与Trait

文档处理类实现

phpinterface运用场景技巧_PHP 新特点若何善用接口与Trait
(图片来自网络侵删)

<?phpclass DocumentStore { protected $data = []; / 参数限定为 Documentable 工具,这是一个接口 / public function addDocument(Documentable $document) { $key = $document->getId(); $value = $document->getContent(); $this->data[$key] = $value; } public function getDocuments() { return $this->data; }}

这个是我们的文档处理类,它面向的是接口操作 Documentable 实现:

<?phpinterface Documentable { public function getId(); public function getContent();}

详细实现接口的类,比如是从html得到的文档 实现:

<?phpclass 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; }}

读取流数据的文档 实现:

<?phpclass 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; }}

详细利用 :

<?phprequire 'Documentable.php';require 'DocumentStore.php';require 'HtmlDocument.php';require 'StreamDocument.php';require 'CommandOutputDocument.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());

须要解释的是参数类型 addDocument 参数类型限定为 Documentable 实现该接口的工具都可以做参数。

性状( trait )

性状是类的部分实现,可以混入一个或者多个现有的类实现中,有两个浸染:

1表明类可以做什么;

2 供应模块化实现;

利用场景:

我们做面向工具的开拓的时候都会通过基类实现基本功能,完后子类详细实现详细的功能,各种之间有明显的自然的继续关系,如果有一个逻辑既不属于A类也不属于B类,那么在性状涌现之前我们怎么办理:

办理办法一:做一个父类 让A, B都继续,这样做的缺陷是,逼迫把两个不干系的类继续同一父类,构造混乱毁坏了封装。

办理方法二:做一个接口,让A, B都去实现这个接口,强于上一个方法,但是缺陷是相同的逻辑会在多个类中实现,代码逻辑冗余,加大掩护本钱。

办理办法三:利用性状(trait)推举做法。

定义性状:

<?php// 推举把性状当类看待,一个文件定义一个性状trait MyTrait { protected $p1; public $p2; public function f1() { }}

利用性状:

<?phpclass MyClass { use MyTrait;}

之后实例工具就可以利用性状里的属性方法就像利用本类的一样;php阐明器会把性状的代码复制到类定义中,有点像c措辞中的宏。

举两个例子,怎么样写好代码

最经典的算法,献给正在口试道路上的你

如果你现在在口试PHP的道路上,看看口试根本题吧

Redis干系口试题

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0