Modern PHP interface 接口
接口 demo:
modern-php/
├── data
│ └── stream.txt
└── interface
├── CommandOutputDocument.php
├── DocumentStore.php
├── Documentable.php
├── HtmlDocument.php
├── StreamDocument.php
└── index.php
// interface
<?php interface Documentable {
public function getId(); public function getContent();
}
Documentable.php
// class x 3 implements interface
<?php
require_once __DIR__ . '/Documentable.php'; class HtmlDocument implements Documentable {
protected $url; public function __construct($url) {
$this->url = $url;
} public function getId() {
return $this->url;
} /**
* @return string
*/
public function getContent() {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_MAXREDIRS => 3
]);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
}
HtmlDocument.php
1 <?php
2 require_once __DIR__ . '/Documentable.php';
3
4 class StreamDocument implements Documentable {
5
6 protected $resource;
7 protected $buffer;
8
9 public function __construct($resource, $buffer = 4096) {
10 $this->resource = $resource;
11 $this->buffer = $buffer;
12 }
13
14 public function getId() {
15 return 'resource-' .(int)$this->resource;
16 }
17
18 public function getContent() {
19 $streamContent = '';
20 rewind($this->resource);
21 while (feof($this->resource) === false) {
22 $streamContent .= fread($this->resource, $this->buffer);
23 }
24 return $streamContent;
25 }
26 }
StreamDocument.php
1 <?php
2 require_once __DIR__ . '/Documentable.php';
3
4 class CommandOutputDocument implements Documentable {
5
6 protected $command;
7
8 public function __construct($command) {
9 $this->command = $command;
10 }
11
12 public function getId() {
13 return $this->command;
14 }
15
16 public function getContent() {
17 return shell_exec($this->command);
18 }
19 }
CommandOutputDocument.php
// Container
1 <?php
2 include 'Documentable.php';
3
4 class DocumentStore {
5 protected $data = [];
6
7 public function addDocument(Documentable $document) {
8 $key = $document->getId();
9 $value = $document->getContent();
10 $this->data[$key] = $value;
11 }
12
13 public function getDocuemnts() {
14 return $this->data;
15 }
16 }
DocumentStore.php
// Usage:
<?php
include 'DocumentStore.php'; include 'HtmlDocument.php';
include 'StreamDocument.php';
include 'CommandOutputDocument.php'; $documentStore = new DocumentStore(); $htmlDoc = new HtmlDocument('https://php.net');
$documentStore->addDocument($htmlDoc); $streamDoc = new StreamDocument(fopen('../data/stream.txt', "rb"));
$documentStore->addDocument($streamDoc); $cmdDoc = new CommandOutputDocument('cat /etc/hosts');
$documentStore->addDocument($cmdDoc); print_r($documentStore->getDocuemnts());
index.php
Modern PHP interface 接口的更多相关文章
- as3.0 interface接口使用方法
[转]as3.0 interface接口使用方法 AS在2.0的时候就支持接口了 接口能够让你的程序更具扩展性和灵活性,打个例如 比方你定义了一个方法 代码: public function aMet ...
- interface接口
当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口 interface. 定义接口使用的关键字不是class,是interface.接口中常见的成员: 这些成员都有 ...
- golang面向对象和interface接口
一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...
- Golang 入门系列(四)如何理解interface接口
前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章.https://www.cnblogs.com/zhangweizhong/category ...
- go interface接口
一:接口概要 接口是一种重要的类型,他是一组确定的方法集合. 一个接口变量可以存储任何实现了接口方法的具体值.一个重要的例子就是io.Reader和io.Writer type Reader inte ...
- java interface接口的传值方法
A 类 package interface_test; public class A { private IPresenter ip; public A(IPresenter ip) { this.i ...
- JAVA 构造器, extends[继承], implements[实现], Interface[接口], reflect[反射], clone[克隆], final, static, abstrac
记录一下: 构造器[构造函数]: 在java中如果用户编写类的时候没有提供构造函数,那么编译器会自动提供一个默认构造函数.它会把所有的实例字段设置为默认值:所有的数字变量初始化为0;所有的布尔变量设置 ...
- 011-对象——interface接口说明与使用方式实例
<?php /** interface接口说明与使用方式实例 * * 接口里面的方法全是抽象方法,没有实体的方法.这样的类我们就叫做接口.定义的时候用Interface定义.实现接口时用impl ...
- Java Interface接口
Java 中接口概念 接口可以理解为一种特殊的 类,由 全局常量 和 公共的抽象方法 所组成. 类是一种具体实现体,而接口定义了某一批类所需要遵循的规范,接口不关心这些类的内部数据, 也不关心这些类里 ...
随机推荐
- Windows内核-7-(IRP)I/O请求包
Windows内核-7-(IRP)I/O请求包 IRP(I/O Request Packet)就是一个进行I/O操作的请求包. IRP是一个结构体,谁分配谁就得释放,通常由执行体里的管理器,获取内核驱 ...
- xv6学习笔记(4) : 进程调度
xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...
- NOIP 模拟 6 辣鸡
题解 难得啊,本来能 \(AC\) 的一道题,注释没删,挂了五分,难受 此题暴力很好想,就是直接 \(n^2\) 枚举不同的矩阵组合,记录块内答案和跨块的答案 出题人不会告诉你,这题只要输出块内答案就 ...
- NOIP 模拟 6 考试总结
T1 这道题是一道裸的暴力,考场写挂了 \(5pts\) 原因竟是忘了删注释,难受 题解 T2 这道题是一道启发式合并,没想出来,拿了个暴力分跑了 题解 T3 这道题就是一道数学期望,想出来就水得很, ...
- [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积
[源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 目录 [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 0x00 摘要 0x01 概述 1.1 前文回 ...
- .net 温故知新:【5】异步编程 async await
1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...
- 备战秋招之十大排序——O(n^2)级排序算法
一.冒泡排序 冒泡排序是入门级的算法,但也有一些有趣的玩法.通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值 / 最小值冒泡到最后一位: 经过优化的写法:使用一个变量记录当前轮次的比 ...
- 将数组对象相同key的内容合并
function fireDuplicate (arr) { var arr = JSON.parse(JSON.stringify(arr)) var ids = [] arr.forEach(fu ...
- 如何在github上传本地项目代码
首先你要在github上申请一个账号 网址:https://github.com/ 然后你要下载一个git工具 网址:https://gitforwindows.org/ 进入官网直接下载就行,下载完 ...
- mzy git学习, 保留现场,恢复现场,以及bug分支处理(七)
git stash 在git中有时候我们工作做了一半,但是有点急事需要离开一段时间,或者现在需要切换到另一个分支下,去维护和修改一些其它的东西,但是我们现在的工作还没有完成,提交上去的话,并不是完整的 ...