最近在扩展ZF的视图层, ZF是1.6版本, 看起来确实不错. 但是有个问题, 我们的视图层是结构话的, 一个视图的输出可能需要调用多个控制器的viewController(我们自己创建的控制器内部的视图控制器,这个和Zend_View是不同的), 但是ZF的路由过程和对象结构是从前端控制器开始直接到行为控制器(ActionController)的,那么我们如何实现,一次请求, 调用多个控制器的"自建视图控制器".
所以就出了这个PHP静态实例化对象的玩法,比较有意思.大家可以琢磨琢磨.
- class JasonTest{
- protected static $oJasonTest = NULL ;
- protected static $hi = NULL;
- function sayHello(){
- echo "hello: ". self::$hi."<br />";
- }
- function & getInstance(){
- return self::$oJasonTest = new self() ;
- }
- function setHi($a){
- self::$hi = $a ;
- }
- }
- $jasonTest = & JasonTest::getInstance() ;
- $jasonTest_1 = & JasonTest::getInstance() ;
- $jasonTest_1->setHi(" This is jason");
- print_obj($jasonTest);
- $jasonTest->sayHello();
- $jasonTest->setHi("This is not jason");
- $jasonTest_1->sayHello();
下面是对上面代码的第二次修改, 这样比较更实用和能够说明问题一些:
- class JasonTest{
- protected static $oJasonTest = NULL ;
- protected static $hi = NULL;
- protected $hiGo = array();
- function sayHello(){
- print_obj($this->hiGo);
- //echo "hello: ". self::$hi."<br />";
- }
- static function getInstance(){
- if(!is_a(self::$oJasonTest,"JasonTest"))
- return self::$oJasonTest = new self() ;
- else
- return self::$oJasonTest ;
- }
- function setHi($a){
- self::$hi = $a ;
- $this->hiGo[] = $a ;
- }
- }
- $jasonTest = JasonTest::getInstance() ;
- $jasonTest_1 = JasonTest::getInstance() ;
- $jasonTest_1->setHi(" This is jason");
- print_obj($jasonTest);
- $jasonTest->sayHello();
- $jasonTest->setHi("This is not jason");
- $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" }
说明: 这个方法是用来在任何地方都可以通过一个类的静态方法获取这个类的同一个实例对象,这样我们就可以在全站不同对象和程序中调用这个对象, 并且始终对同一个对象进行操作. 这样的方法对全站统一管理,或者应用内部统一管理方法的实现比较有帮助.