php教程:php设计模式介绍之单条模式(2)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php教程:php设计模式介绍之单条模式(2)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:模式教程介绍一个
黑客防线网安网讯:  WebjxCom提示:php教程:php设计模式介绍之单条模式.    样本代码    单件模式是一个很有趣的模式。让我们用PHP4和PHP5两种方式来探究它的实现过程,现在从PHP4开始。    全...
  WebjxCom提示:php教程:php设计模式介绍之单条模式.
  
  样本代码
  
  单件模式是一个很有趣的模式让我们用PHP4和PHP5两种方式来探究它的实现过程现在从PHP4开始
  
  全局方式
  
  理论上说一个全局变量可以生成一个完美的单件,但全局变量可能被修改:在代码运行过程中,不能保证全局变量指向的是一个对象。因而,不让全局变量在全局直接引用,就可以减少“太随意访问”这个全局变量的问题。比如说,这段代码使用一个非常长而且独特的名字,从而“隐藏”了全局变量的引用。
  
  classDbConn{
  
  functionDbConn($fromGetInstance=false){
  
  if(M_E!=$fromGetInstance){
  
  trigger_error(‘TheDbConnclassisaSingleton,’
  
  .’pleasedonotinstantiatedirectly.’);
  
  }
  
  }
  
  function&getInstance(){
  
  $key=‘__some_unique_key_for_the_DbConn_instance__’;
  
  if(!(array_key_exists($key,$GLOBALS)&&is_object($GLOBALS[$key])
  
  &&‘dbconn’==get_class($GLOBALS[$key]))){
  
  $GLOBALS[$key]=&newDbConn(M_E);
  
  }
  
  return$GLOBALS[$key];
  
  }
  
  }
  
  在DbConn的构造函数中,你可能对$fromGetInstance的默认参数感到疑惑。在对象被直接实例化时,它能够提供(很微弱的)保护:除非这个默认值变成e(在PHP的数学常量中M_E=2.718281828459),否则这段代码会报错。
  
  表示成一个UML类图,解决办法如下:
  
  如果你不选用这个“神秘参数”-类型保护,建立一个全局标记是另外一个选择,用它来验证你是通过getInstance()方法来创建的对象。保护方式从“你知道它的名字”改变成“它存在于环境中”。
  
  下面有个例子,它解释了为什么构造函数保护代码有一个全局的标识:
  
  classDbConn{
  
  functionDbConn(){
  
  $token=‘__some_DbConn_instance_create_semaphore__’;
  
  if(!array_key_exists($token,$GLOBALS)){
  
  trigger_error(‘TheDbConnclassisaSingleton,’
  
  .’pleasedonotinstantiatedirectly.’);
  
  }
  
  }
  
  function&getInstance(){
  
  static$instance=array();
  
  if(!$instance){
  
  $token=‘__some_DbConn_instance_create_semaphore__’;
  
  $GLOBALS[$token]=true;
  
  $instance[0]=&newDbConn;
  
  unset($GLOBALS[$token]);
  
  }
  
  提示
  
  PHP4允许你改变构造函数中$this的值。在过去,我们会习惯设置$this=null;当有一个创建构造错误时,确保无效的对象不能被代码继续使用。PHP4中很有用的东西,在PHP5中并不兼容,将来会在你的代码中得到验证,这种技术不再被推荐。
  
  这段代码中另外一个重点是引用操作&的用法。有两种地方需要使用&。第一种是在函数定义时,在函数名字前用来表示将返回一个引用。第二种是将新的DbConn对象赋值给$GLOBALS数组。(在序言和值对象章节中提到过:在PHP4中,你总会使用&操作符,以引用的方式创建、传递和返回对象,)
  
  getInstance()方法的条件检查,常常被写成没有警示的情况下运行,甚至在E_ALL的错误级别下也不会提示。它检查在$GLOBAL数组中适当的位置是否有一个DbConn对象,如果没有,就在那里创建这个对象。这个方法于是返回了这样的结果,这个对象能被重复创建或者这个对象在之前已经被这个方法创建过了。当方法结束时,你可以确认已经拥有这个类的有效实例,而且它已经被有效初始化。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17442-1.html
网站维护教程更新时间:2012-09-21 05:19:00  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer