玩一玩PHP的静态对象

最近在扩展ZF的视图层, ZF是1.6版本, 看起来确实不错. 但是有个问题, 我们的视图层是结构话的, 一个视图的输出可能需要调用多个控制器的viewController(我们自己创建的控制器内部的视图控制器,这个和Zend_View是不同的), 但是ZF的路由过程和对象结构是从前端控制器开始直接到行为控制器(ActionController)的,那么我们如何实现,一次请求, 调用多个控制器的"自建视图控制器".

 

所以就出了这个PHP静态实例化对象的玩法,比较有意思.大家可以琢磨琢磨.

 

  1. class JasonTest{
  2.     
  3.     protected static $oJasonTest = NULL ;
  4.     protected static $hi = NULL;
  5.     
  6.     function sayHello(){
  7.             echo "hello: ". self::$hi."<br />"
  8.     }
  9.     function & getInstance(){
  10.             return self::$oJasonTest = new self() ; 
  11.     }
  12.     function setHi($a){
  13.             self::$hi = $a ;    
  14.     }
  15.     
  16. }
  17. $jasonTest = & JasonTest::getInstance() ;
  18. $jasonTest_1 = & JasonTest::getInstance() ;
  19. $jasonTest_1->setHi(" This is jason");
  20. print_obj($jasonTest);
  21. $jasonTest->sayHello();
  22. $jasonTest->setHi("This is not jason");
  23. $jasonTest_1->sayHello();

 

下面是对上面代码的第二次修改, 这样比较更实用和能够说明问题一些:

 

  1. class JasonTest{
  2.     
  3.     protected static $oJasonTest = NULL ;
  4.     protected static $hi = NULL;
  5.     protected $hiGo = array();
  6.     
  7.     function sayHello(){
  8.             print_obj($this->hiGo);
  9.             //echo "hello: ". self::$hi."<br />";   
  10.     }
  11.     static function getInstance(){
  12.             if(!is_a(self::$oJasonTest,"JasonTest"))
  13.                 return self::$oJasonTest = new self() ;
  14.             else
  15.                 return self::$oJasonTest ;
  16.     }
  17.     function setHi($a){
  18.             self::$hi = $a ;
  19.             $this->hiGo[] = $a ;
  20.     }
  21. }
  22. $jasonTest = JasonTest::getInstance() ;
  23. $jasonTest_1 = JasonTest::getInstance() ;
  24. $jasonTest_1->setHi(" This is jason");
  25. print_obj($jasonTest);
  26. $jasonTest->sayHello();
  27. $jasonTest->setHi("This is not jason");
  28. $jasonTest_1->sayHello();

第二次修改代码后的输出结果 如下:

 

object(JasonTest)#13 (1) {
  ["hiGo:protected"]=>
  array(1) {
    [0]=>
    string(14) " This is jason"
  }
}

array(1) {
  [0]=>
  string(14) " This is jason"
}

array(2) {
  [0]=>
  string(14) " This is jason"
  [1]=>
  string(17) "This is not jason"
}

 

 

说明: 这个方法是用来在任何地方都可以通过一个类的静态方法获取这个类的同一个实例对象,这样我们就可以在全站不同对象和程序中调用这个对象, 并且始终对同一个对象进行操作. 这样的方法对全站统一管理,或者应用内部统一管理方法的实现比较有帮助.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值