author:胡旭个人博客
blog:http://www.ihuxu.com
欢迎关注~~~~
对于一些逻辑稍微复杂的程序,很难避免出现在不某个类中无法访问另一个类所持有的引用。这样也就导致了编程的灵活度下降,尽管可以再次创建新的引用,也会浪费资源,甚至达不到要求。下面我来句一个例子:
比如,后台的模板文件有两个。admin_bar.html,和admin_comment.html。我现在有两个类,分别是adminAction.class.php,和adminCommentAction.class.php。admin_bar.html文件就是我们通常看到的后台管理的工具栏(通常在左边),admin_comment.html是每个工具功能项(评论)所对应的内容。如下图所示:
这样,我们在adminAction控制器类中先用模板引擎处理好admin_bar.html文件,完了根据url或表单传进来的参数进入到adminCommentAction控制器类。代码示例:
<?php
class adminAction{ private $smarty = null; public function _construct(){
$this->smarty = new Smarty(); } private function show(){
$this->smarty->dispose('admin_bar.html');
if($_GET['action'] == 'comment'){
new adminCommentAction();
}
if(){
//...
}
return;
}
} class adminCommentAction{
public function _construct(){
//???
}
}
那么,到代码执行到adminCommentAction中时,就无法拿到adminAction中持有的smarty引用了。也许说,可以通过构造参数来传递,不过这里介绍一种更好的方式 --- 门面模式(总于进入主题了)。它能够更灵活的管理代码程序中的饮用对象。下面简单的门面模式类代码示例:
<?php
/**
* 对象引用管家 - 门面模式
*/
class ObjectManager implements ObjectType{
private static $Objects = array(); public static final function get_object($key){ if(array_key_exists($key, ObjectManager::$Objects)){
return ObjectManager::$Objects[$key];
}
return FALSE;
} public static final function set_object($key, $Object){
if(!array_key_exists($key, ObjectManager::$Objects)){
ObjectManager::$Objects[$key] = $Object;
return TRUE;
}
return FALSE;
} public static final function clear_object($key){
if(array_key_exists($key, ObjectManager::$Objects)){
unset(ObjectManager::$Objects[$key]);
return TRUE;
}
return FALSE;
}
}
当然,最好给ObjectManager写一个接口类,其中存一些引用的类型,以便处理。
<?php
/**
* 全局对象引用类型常量接口
*
*/
interface ObjectType{ /**
* 后台控制器adminAction所持有的Smarty引用对象,其用于相应模板文件的模板引擎动作。
*
*/
const ADMINACTIONENGIEN= 'AdminActionEngien'; }
那么这个时候就可以这样灵活的运用了,代码示例:
<?php
class adminAction{ private $smarty = null; public function _construct(){
$this->smarty = new Smarty();
ObjectManager::set_object(ObjectManager::ADMINACTIONENGIEN, $this->smarty);
} private function show(){
$this->smarty->dispose('admin_bar.html');
if($_GET['action'] == 'comment'){
new adminCommentAction();
}
if(){
//...
}
return;
}
} class adminCommentAction{
private $smarty = null;
public function _construct(){
$this->smarty = ObjectManager::get_object(ObjectManager::ADMINACTIONENGIEN);
$this->smarty->require_file();//这个函数可能smarty没有,因为我用的引擎是自己写的
$this->smarty->assign();
$this—>smarty->display();
}
}