博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 之 代理模式
阅读量:5749 次
发布时间:2019-06-18

本文共 2943 字,大约阅读时间需要 9 分钟。

代理模式是很好用的,不过我们经常用JS来实现一些图片的懒加载,而且现在有很多继承好的js

对于PHP的,肯定不仅仅限于图片,不过这次的例子还是PHP的图片代理,是可以直接显示图片的,修改下路径就好。

应用情境:1.图片代理,2.远程代理,3.智能指引,4.虚拟代理,5.动态代理

一般是开启多线程。代理对象中一个线程向客户端浏览器加载一个小图片,第二个线程调用大图片加载程序第三个线程,当用户浏览大图还没有加载出来就显示 相应的提示信息  (这个示例没有利用线程

这样的话就完全将加载图片放在了后台,同样处理其他的业务也是可以借鉴

上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
    
//多用于功能列表,继承一些公用的接口函数
    
interface 
Image{
        
public 
function 
getWidth();
        
public 
function 
getHeight();
        
public 
function 
getPath();
 
    
/**  
     
* @return string   the image's byte stream  
     
*/ 
        
public 
function 
dump();
    
}
    
//可以多体会下抽象对象的用法,不能实例化
    
abstract 
class 
AbstractImage 
implements 
Image{
        
protected 
$_width
;
        
protected 
$_height
;
        
protected 
$_path
;
        
protected 
$_data
;
        
protected 
$_type
;
 
        
public 
function 
getWidth(){
            
return 
$this
->_width;
        
}
 
        
public 
function 
getHeight(){
            
return 
$this
->_height;
        
}
 
        
public 
function 
getPath(){
            
return 
$this
->_path;
        
}
 
         
    
}
 
        
//具体的实体对象 继承抽象类对于接口的重写
        
//可以直接使用抽象对象的通用属性width,height,path,data
        
//包括可以直接重新定义接口里的函数
        
//这是实际的图片对象
    
class 
RawImage 
extends 
AbstractImage{
        
public 
function 
__construct(
$path
){
            
$this
->_path = 
$path
;
            
//list() 函数用数组中的元素为一组变量赋值。按照数组的数字索引 依次赋值
            
//注意,与 array() 类似,list() 实际上是一种语言结构,不是函数。
            
list(
$this
->_width,
$this
->_height) = 
getimagesize
(
$path
);
            
$this
->_type = 
getimagesize
(
$path
)[
'mime'
];
            
//file_get_contents() 函数把整个文件读入一个字符串中。
            
//和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
            
//file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。
            
$this
->_data = 
file_get_contents
(
$path
);
        
}
         
        
public 
function 
dump_type(){
            
return 
$this
->_type;
        
}
 
        
public 
function 
dump(){
            
return 
$this
->_data;
        
}
    
}
    
//它和实际的图片对象继承同一个抽象接口,基本上就是同样的
    
//这时候就可以增加很多人性化的功能,与图片无关,与用户体验有关
    
class 
ImageProxy 
extends 
AbstractImage{
        
protected 
$_realImage
;
 
        
public 
function 
__construct(
$path
){
            
$this
->_path = 
$path
;
            
list(
$this
->_width,
$this
->_height) = 
getimagesize
(
$path
);
            
$this
->_type = 
getimagesize
(
$path
)[
'mime'
];
            
//这里就没必要获取图片的真实数据,毕竟很大
        
}
 
     
/**  
     
* Creates a RawImage and exploits its functionalities.  
     
*/
     
//这里去获取真实图片的所有数据
        
protected 
function 
_lazyLoad(){
            
if
(
$this
->_realImage === null){
                
$this
->_realImage = 
new 
RawImage(
$this
->_path);
            
}
        
}
 
        
public 
function 
dump_type(){
            
return 
$this
->_type;
        
}
 
        
public 
function 
dump(){
            
$this
->_lazyLoad();
            
return 
$this
->_realImage->dump();
        
}
    
}
 
 
 
    
//基本上一个很简单的代理写完了,如何发挥更多的效用,需要好好引进去很多处理思路,但是位置一定是写在代理里面
    
//下面就是客户端类
    
class 
Client{
        
public 
function 
tag(Image 
$img
){
             
$type
=
$img
->dump_type();
             
header(
"content-type:$type"
);
             
echo 
$img
->dump();
        
}
    
}
 
    
$path 
'd:/image/timg3.jpg'
;
    
$client 
new 
Client();
 
 
    
$image 
new 
ImageProxy(
$path
);
    
//$image = new RawImage($path);
    
$client
->tag(
$image
);
?>

愿法界众生,皆得安乐。

本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1954719

转载地址:http://vxezx.baihongyu.com/

你可能感兴趣的文章
eclipse中安装配置maven
查看>>
关于去除Dialog的黑色背景框
查看>>
距离公式
查看>>
XML解析器(转)
查看>>
IE6中position:fixed无效问题解决
查看>>
用户行为跟踪
查看>>
通过 iTextSharp 实现PDF 审核盖章
查看>>
VS2013中web项目中自动生成的ASP.NET Identity代码思考
查看>>
jsonp跨域+ashx(示例)
查看>>
discuz!X2.5技术文档
查看>>
Revit API改变风管及管件尺寸
查看>>
用Qt写软件系列三:一个简单的系统工具(上)
查看>>
Android学习笔记:利用httpclient和AsyncTask 发起网络http post操作
查看>>
创建分区表过程
查看>>
iOS UI基础-1.0加法计算器
查看>>
java在url传输前更改字符编码
查看>>
修复ecshop商品重量BUG小数位增至五位
查看>>
maven常见问题
查看>>
Mac工具
查看>>
django复习笔记2:models
查看>>