找回密码
 注册
广告投放 虚位以待【阿里云】2核2G云新老同享 99元/年,续费同价做网站就用糖果主机-sugarhosts.comJtti.com-新加坡服务器,美国服务器,香港服务器
查看: 483|回复: 2

我这代码哪里错了?

[复制链接]
发表于 2008 年 11 月 11 日 13:56:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
刚学PHP不久....这个代码是查看是不是IE的

但怎么拿IE访问提示不是IE,拿非IE浏览也还是提示非IE
  1. <?php
  2. //baseAgent 类,抽象的基类
  3. abstract class baseAgent
  4. {
  5.         abstract function PrintPage();
  6. }
  7. //ieAgent类,用于客服端是IE时调用的类
  8. class ieAgent extends baseAgent
  9. {
  10.         function PrintPage()
  11.         {
  12.                 return "你所使用的是IE浏览器";
  13.         }
  14. }
  15. //otherAgnet类,用于客幅端不是IE时的调用的类
  16. class otherAgent extends baseAgent
  17. {
  18.         function PrintPage()
  19.         {
  20.                 return "当前浏览器不是IE!";
  21.         }
  22. }
  23. //判断并创建不同的对象类型,对象名为$currPage
  24. if(strstr($_SERVER["HTTP_USER_AGENT"],"IEAGENT"))
  25. {
  26.         $currPage = new ieAgent();
  27. }
  28. else
  29. {
  30.         $currPage = new otherAgent();
  31. }
  32. //输出
  33. echo  $currPage->PrintPage();
  34. ?>
复制代码
在验证的时候,if(strstr($_SERVER["HTTP_USER_AGENT"],"IEAGENT"))提示出错
声明:PHPDocument1 行 103 - Undefined index:  HTTP_USER_AGENT
但看不出来错哪了...谁帮我瞧瞧- -
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
发表于 2008 年 11 月 11 日 16:09:27 | 显示全部楼层
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
策略模式(Strategy Pattern)

       策略模式指的是程序中涉及决策控制的一种模式。例如,一段 PHP 代码用来显示一张 HTML 页面,访问者的浏览器可能会是 IE,也可能会是 Netscape。这时程序就需要根据客户端浏览器的不同显示不同的网页内容。

       策略模式通常通过定义一个抽象的基类,然后根据情况的不同创建不同的类继承这个基类。接下来,根据实际情况的判断,对这个基类采用不同的方式进行继承。

       以下代码实现了根据客户端浏览器的类型输出不同文字表达式的功能。这里,PHP 是通过 $_SERVER['HTTP_USER_AGENT'] 来获取用户端信息的。
  1. <?php   
  2. //baseAgent类,抽象的基类   
  3. abstract class baseAgent   
  4. {   
  5.   abstract function PrintPage();   
  6. }   
  7. //ieAgent 类,用于客户端是 IE 时调用的类   
  8. class ieAgent extends baseAgent   
  9. {   
  10.   function PrintPage()   
  11.   {   
  12.     return '当前浏览器是 IE!';   
  13.   }   
  14. }   
  15. //otherAgent 类,用于客户端不是 IE 时调用的类   
  16. class otherAgent extends baseAgent   
  17. {   
  18.   function PrintPage()   
  19.   {   
  20.     return '当前浏览器不是 IE!';   
  21.   }   
  22. }   
  23. //判断并创建不同的对象类型,对象名为 $currPage   
  24. if(strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))   
  25. {   
  26.   $currPage = new ieAgent();   
  27. }   
  28. else   
  29. {   
  30.   $currPage = new otherAgent();   
  31. }   
  32. //输出   
  33. echo $currPage->PrintPage();   
  34. ?>   
复制代码
上面程序在 IE 下的输出结果如下所示。

       当前浏览器是 IE!

单例模式(Singleton Pattern)

       单例模式指的是在应用程序的范围内只对指定的类创建一个实例。例如,对于一篇公共的文档可以允许多个用户同时阅读,但是仅允许一个用户编辑,否则会出现更新不同步的问题。

       单例模式包含的对象只有一个,就是单例本身。使用单例模式的类通常拥有一个私有构造耿耿数和一个私有克隆函数,确保用户无法通过创建对象或克隆的方式对其进行实例化。除些之外,该模式中还包含一个静态私有成员变量 $instance 与静态方法 getInstance。 getInstance 方法负责对其本身实例化,然后将这个对象存储在 $instance 静态成员变量中,以确保只有一个实例被创建。

       以下代码是一个简单的单例模式的例子,通过对单例属性 $switch 的设置实现了对开关状态的改变。
  1. <?php   
  2. //单例模式的类 Lock   
  3. class Lock   
  4. {   
  5.   //静态属性 $instance   
  6.   static private $instance = NULL;   
  7.   //一个普通的成员属性   
  8.   private $switch = 0;   
  9.   //getInstance 静态成员方法   
  10.   static function getInstance()   
  11.   {   
  12.     //如果对象实例还没有被创建,则创建一个新的实例   
  13.      if(self::$instance == NULL)   
  14.     {   
  15.       self::$instance = new Lock();   
  16.     }   
  17.     //返回对象实例   
  18.      return self::$instance;   
  19.   }   
  20.   //空构造函数   
  21.   private function Lock()   
  22.   {   
  23.   }   
  24.   //空克隆成员函数   
  25.   private function __clone()   
  26.   {   
  27.   }   
  28.   //设置$switch的函数,如果$switch为0则将其设置成1,否则将其设置成0   
  29.   function setLock()   
  30.   {   
  31.     if($this->switch = 0)   
  32.       $this->switch = 1;   
  33.     else   
  34.       $this->switch = 0;   
  35.   }   
  36.   //获取$switch状态   
  37.   function getLock()   
  38.   {   
  39.     return $this->switch;   
  40.   }     
  41. }   
  42.    
  43. //调用单例,设置$switch   
  44. Lock::getInstance()->setLock();   
  45. //判断开关状态   
  46. if(Lock::getInstance()->setLock() == 0)   
  47.   echo '开关状态: 关';   
  48. else   
  49.   echo '开关状态: 开';   
  50. ?>   
复制代码
运行结果如下所示。

       开关状态:开

       从上面的运行结果可以看出,第一次调用 Lock::getInstance()将$switch 设置成 1,第二次调用 Lock::getInstance()时获取的对象与第一次调用时相同。所以输出结果为 $switch 为 1 时的结果。

工厂模式(Factory Pattern)

       工厂模式是指创建一个类似于工厂的类,通过对类中成员方法的调用返回不同类型的对象。例如,一个管理系统对于访问用户的权限设置是不同的。对于普通用户仅拥有一般的浏览权限,对于管理员拥有对数据的修改和删除权限,对于维护人员拥有访问用户的授权权即用等。

       工厂模式通常创建一个基类,根据对象类型的不同创建不同的扩展类,而工厂类就像生产零件一件,生产出类型不同的对象。在主程序中,通过对对象的调用实现不同的功能。

       以下代码实现了一个管理系统的例子。Factory 类就是一个工厂类,类中方法 Create 用于创建类型不同的对象得到不同的权限。
  1. <?php   
  2. //抽象基类User   
  3. abstract class User   
  4. {   
  5.   protected $name = NULL;   
  6.   //构造函数   
  7.   function User($name)   
  8.   {   
  9.     $this->name = $name;   
  10.   }   
  11.   //获取属性 $name   
  12.   function getName()   
  13.   {   
  14.     return $this->name;   
  15.   }   
  16.   //是否具有浏览权限   
  17.   function ViewAccess()   
  18.   {   
  19.     return 'No';   
  20.   }   
  21.   //是否具有编辑权限   
  22.   function EditAccess()   
  23.   {   
  24.     return 'No';   
  25.   }   
  26.   //是否具有删除权限   
  27.   function DeleteAccess()   
  28.   {   
  29.     return 'No';   
  30.   }   
  31.   //是否具有用户管理权限   
  32.   function ManageAccess()   
  33.   {   
  34.     return 'No';   
  35.   }   
  36. }   
  37. //普通用户   
  38. class Client extends User   
  39. {   
  40.   function ViewAccess()   
  41.   {   
  42.     return 'Yes';   
  43.   }   
  44. }   
  45. //管理员   
  46. class Administrator extends User   
  47. {   
  48.   function ViewAccess()   
  49.   {   
  50.     return 'Yes';   
  51.   }   
  52.   function EditAccess()   
  53.   {   
  54.     return 'Yes';   
  55.   }   
  56.   function DeleteAccess()   
  57.   {   
  58.     return 'Yes';   
  59.   }   
  60. }   
  61. //维护人员   
  62. class Supporter extends User   
  63. {   
  64.   function ViewAccess()   
  65.   {   
  66.     return 'Yes';   
  67.   }   
  68.   function EditAccess()   
  69.   {   
  70.     return 'Yes';   
  71.   }   
  72.   function DeleteAccess()   
  73.   {   
  74.     return 'Yes';   
  75.   }   
  76.   function ManageAccess()   
  77.   {   
  78.     return 'Yes';   
  79.   }   
  80. }   
  81.    
  82. //工厂类   
  83. class Factory   
  84. {   
  85.   //静态成员属性   
  86.   private static $users = array('Simon'=>'Client', 'Elaine'=>'Administrator', 'Bob'=>'Supporter');   
  87.    
  88.   //创建对象的成员方法   
  89.   static function Create($name)   
  90.   {   
  91.     switch(self::$users[$name])   
  92.     {   
  93.       case 'Client':   
  94.         return new Client($name);   
  95.       case 'Administrator':   
  96.         return new Administrator($name);   
  97.       case 'Supporter':   
  98.         return new Supporter($name);   
  99.     }   
  100.   }   
  101. }   
  102.    
  103. //一个存放用户名的数组   
  104. $users = array('Elaine', 'Simon', 'Bob');   
  105. //对于每个用户分析其权限   
  106. foreach($users as $user)   
  107. {   
  108.   $obj = Factory::Create($user);   
  109.   echo $obj->getName().' 的权限';   
  110.   echo '浏览:'.$obj->ViewAccess()."\n";   
  111.   echo '修改:'.$obj->EditAccess()."\n";   
  112.   echo '删除:'.$obj->DeleteAccess()."\n";   
  113.   echo '管理:'.$obj->ManageAccess()."\n";   
  114. }   
  115. ?>   
复制代码
需要注意的是工厂模式通常与策略模式结合使用,工厂模式通过对实例情况的判断正确的策略创建出合适的对象。
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

 楼主| 发表于 2008 年 11 月 11 日 16:12:47 | 显示全部楼层
但我的显示不出来是IE...
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|金光论坛

GMT+8, 2025 年 2 月 1 日 15:47 , Processed in 0.026906 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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