设为首页 收藏本站
查看: 888|回复: 0

[经验分享] PHP中实用的模式之【门面模式】

[复制链接]

尚未签到

发表于 2015-8-26 15:24:03 | 显示全部楼层 |阅读模式
         author:胡旭个人博客
         blog:http://www.ihuxu.com
         欢迎关注~~~~
  
  对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问另一个类所持有的引用。这样也就导致了编程的灵活度下降,尽管可以再次创建新的引用,也会浪费资源,甚至达不到要求。下面我来句一个例子:
  比如,后台的模板文件有两个。admin_bar.html,和admin_comment.html。我现在有两个类,分别是adminAction.class.php,和adminCommentAction.class.php。admin_bar.html文件就是我们通常看到的后台管理的工具栏(通常在左边),admin_comment.html是每个工具功能项(评论)所对应的内容。如下图所示:
DSC0000.jpg
  
  这样,我们在adminAction控制器类中先用模板引擎处理好admin_bar.html文件,完了根据url或表单传进来的参数进入到adminCommentAction控制器类。代码示例:
  



1 <?php
2 class adminAction{
3         
4         private $smarty = null;
5         
6         public function _construct(){
7             $this->smarty = new Smarty();
8            
9         }
10         
11         private function show(){
12             $this->smarty->dispose('admin_bar.html');
13             if($_GET['action'] == 'comment'){
14                 new adminCommentAction();
15             }
16             if(){
17                 //...
18             }
19             return;
20         }
21 }
22
23 class adminCommentAction{
24     public function _construct(){
25         //???
26     }
27 }
  
  
  那么,到代码执行到adminCommentAction中时,就无法拿到adminAction中持有的smarty引用了。也许说,可以通过构造参数来传递,不过这里介绍一种更好的方式 --- 门面模式(总于进入主题了)。它能够更灵活的管理代码程序中的饮用对象。下面简单的门面模式类代码示例:



1 <?php
2 /**
3  * 对象引用管家 - 门面模式
4  */
5 class ObjectManager implements ObjectType{
6     private static $Objects = array();
7     
8     public static final function get_object($key){
9         
10         if(array_key_exists($key, ObjectManager::$Objects)){
11             return ObjectManager::$Objects[$key];
12         }
13         return FALSE;
14     }
15
16     public static final function set_object($key, $Object){
17         if(!array_key_exists($key, ObjectManager::$Objects)){
18             ObjectManager::$Objects[$key] = $Object;
19             return TRUE;
20         }
21         return FALSE;
22     }
23     
24     public static final function clear_object($key){
25         if(array_key_exists($key, ObjectManager::$Objects)){
26             unset(ObjectManager::$Objects[$key]);
27             return TRUE;
28         }
29         return FALSE;
30     }
31 }
  当然,最好给ObjectManager写一个接口类,其中存一些引用的类型,以便处理。



<?php
/**
* 全局对象引用类型常量接口
*
*/
interface ObjectType{
/**
* 后台控制器adminAction所持有的Smarty引用对象,其用于相应模板文件的模板引擎动作。
*
*/
const ADMINACTIONENGIEN= 'AdminActionEngien';

}
  那么这个时候就可以这样灵活的运用了,代码示例:



1 <?php
2 class adminAction{
3         
4         private $smarty = null;
5         
6         
7         public function _construct(){
8             $this->smarty = new Smarty();
9             ObjectManager::set_object(ObjectManager::ADMINACTIONENGIEN, $this->smarty);
10         }
11         
12         private function show(){
13             $this->smarty->dispose('admin_bar.html');
14             if($_GET['action'] == 'comment'){
15                 new adminCommentAction();
16             }
17             if(){
18                 //...
19             }
20             return;
21         }
22 }
23
24 class adminCommentAction{
25     private $smarty = null;
26     public function _construct(){
27         $this->smarty =  ObjectManager::get_object(ObjectManager::ADMINACTIONENGIEN);
28         $this->smarty->require_file();//这个函数可能smarty没有,因为我用的引擎是自己写的
29         $this->smarty->assign();
30         $this—>smarty->display();
31     }
32 }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104589-1-1.html 上篇帖子: jsp,php可以gb2312,gbk来做站并用上ajax。我感觉这是 asp.net缺失的部分! 下篇帖子: PHP用CURL伪造IP和来源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表