php乱码转换

$a=(iconv("UTF-8", "gbk//TRANSLIT", $a));
iconv( "utf-8 ", "GBK//IGNORE ",$_POST[ "Notes "])
iconv( "utf-8 ", "GBK//TRANSLIT ",$_POST[ "Notes "])

//IGNORE 这个参数,表示忽略不能转换的字符
//ignore的意思是忽略转换时的错误
//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符
 

Class Page分页

<?php
class Page{
    public $content;
    public $title = "TLA Consulting Pty Ltd";
    public $keywords = "TLA Consulting , Three Letter Abbreviation,some of my best friends are search engines";
    public $buttons = array(
                            "Home" => " home.php",
                            "Contact" => "contact.php",
                            "Services" => "services.php",
                            "Site Map" => "map.php"
                        );
 
public function __set($name,$value){
    $this->$name = $value;
    }
 
public function Display(){
    echo "<html> 
 <head>
";
    $this->DisplayTitle();
    $this->DisplayKeywords();
    $this->DisplayStyles();
    echo "</head>
<body>
";
    $this->DisplayHeader();
    $this->DisplayMenu($this->buttons);
    echo $this->content;
    $this->DisplayFooter();
    echo "</body>
<html>
";
    }
 
public function DisplayTitle(){
    echo "<title>".$this->title."</title>";
    }
public function DisplayKeywords(){
    echo "<meta name="keywords" content="".$this->keywords.""/>";
    }
public function DisplayStyles(){
?>
<style>
h1 {
    color:white; font-size:24pt; text-align:center;
    font-family:arial,sans-serif;
    }
.menu {
    color:white;font-size:12pt;text-align:center;
    font-family:arial,sans-serif;font-weight:bold;
    }
td {
    background:black
    }
p{
    color:black;font-size:12pt;text-align:justify;
    font-family:arial,sans-serif
    }
p.foot{
    color:white;font-size:9pt;text-align:center;
    font-family:arial,sans-serif;font-weight:bold;
    }
a:link,a:visited,a:active{
    color:white
        }
</style>
<?php
}
public function DisplayHeader()
{
?>
<table width="100%" cellpadding="12" cellspacing="0" border="0">
    <tr bgcolor="black">
        <td align = "left"><img src = "logo.gif" /></td>
        <td>
            <h1>TLA Consulting Pty Ltd</h1>
        </td>
        <td align = "right"><img src = "logo.gif" /></td>
    </tr>
</table>
<?php
}
public function DisplayMenu($buttons){
    echo "<table width="100%" bgcolor="white" cellpadding="4">
";
    echo "<tr>
";
 
$width=100/count($buttons);
 
while(list($name,$url)=each($buttons)){
    $this->DisplayButton($width,$name,$url,!$this->IsURLCurrentPage($url));
    }
echo "</tr>
";
echo "</table>
";
}
public function IsURLCurrentPage($url){
    if(strpos($_SERVER["PHP_SEIF"],$url)==false){
        return false;
    }else{
        return true;
        }
    }
    public function DisplayButton($width,$name,$url,$active=true){
        if($active){
            echo "<td width="".$width."%">
            <a href="".$url."">
            <img src="s-logo.gif" alt="".$name."" border="0" /></a>
            <a href="".$url.""><span class="menu">".$name."</span></a>
            </td>";
        }else{
            echo "<td width="".$width."">
            <img src="side-logo.gif">
            <span class="menu">".$name."</span>
            </td>";
            }
        }
    public function DisplayFooter(){
 
 
?>
<table width="100%" bgcolor="black" cellpadding="12" border="0">
    <tr>
        <td>
            <p class="foot">&copy;TLA Consulting Pty Ltd.</p>
            <p class="font">Please see our<a href="">legal information Page</a></p>
        </td>
    </tr>
</table>
<?php
}
}
?> 

使用PHP进行WAP开发详解1

基础篇        
  WAP的发展离不开其WWW的底蕴,毕竟,整个WAP协议的制定参照了WWW的模型,并且尽可能地沿用了Internet的诸多标准和技术,
如WML语言脱胎于HTML与XML,WMLScript与传统的脚本语言也很相似。的确,WAP虽然是个新名词,
但是它却与传统的国际互联网密不可分地结合着,在结构上如此,在技术上更是如此。
  
  在WAP协议中提到WAP页面所使用的标记语言为WML,当需要进行较高级的操作,如使用终端机的某些资源时,
可以使用WMLScript脚本语言,这两种语言很简单,甚至可以用简陋来形容,特别是它们对数据库的操作几乎无能为力,
这种”缺陷”与WAP广阔的商务和应用前景格格不入,但我们并不是无能为力的,由于WAP和WWW的交融,
我们仍然可以使用WWW的技术与资源来解决数据库的访问问题,因为毕竟多数数据库仍处于有线网络内。
  
  目前最流行的网页编程语言和数据库的搭配是什么?相信很多人会说出”PHP”与”MySQL”这两个名字。
它们属于WWW或者有线互联网的范畴,由于使用方便与功能强大的特点而美名传播,那么它们能够为WAP服务吗?
答案是肯定的。不熟悉WAP或者PHP的人或许有些不解,毕竟在传统意义上PHP提供的是WWW的内容与服务,对于WAP,它们能”兼容”吗?

PHP粗解        
看了WAP的介绍,大家应该开始逐步理解PHP为何仍能为WAP服务了。PHP与HTML、WML、Javascript、Java都不一样,它是在服务器端运行的,而Javascript、Java等都运行在浏览器端,相对于WAP,WMLScript运行于客户机端,但是,以上的这些语言都可以很容易与PHP结合起来。   
PHP具有很大的灵活性,在WWW中,它可以生成所需要的任何HTML代码,甚至Javascript代码。同样,在WAP中,我们仍然可以利用PHP这种动态、灵活的特点,生成任意的WML代码,这样,PHP自然能够为WAP服务。   
之所以使用PHP来提供WAP服务,除了它灵活的特点外,还由于PHP可以方便的使用数据库。用户可以使用PHP存取Oracle、Sybase、MS SQL、MySQL、dBase、Informix等任何支持ODBC标准的数据库,这点正好迎合了WAP商务的需求。   
在实用中,一般需要建立PHP文件,当用户向服务器发出浏览该PHP文件的请求时,服务器将根据文件中的代码产生相应的HTML或WML内容,并发送给浏览器或WAP终端。   
如想获取关于PHP的信息,可以前往http://www.php.com查看。
PHP-WML
PHP的系统平台、工作方式、安装方法,这些都不在本文的讨论范围内,毕竟我们的重点是PHP如何与WAP协作。一般而言,为了能让PHP工作,我们需要带有PHP模块的Web服务器,或者说支持PHP的服务器,Apache是世界上最流行的Web服务器,另外,我们还需要安装PHP软件以及如MySQL这样的数据库,具体内容可以查阅相关书籍或网站。下面我们讨论如何让PHP产生WML代码。
  
  在WWW中,PHP产生的第一行内容往往是:content-type: text/html
  
  但是,WAP终端是读不懂这样的标题的。WAP终端从服务器下载的单位是Deck,浏览的单位是Card,一般一个Deck就组成一个WML文件。那么,为WAP服务时,PHP文件中往往需要包含如下的代码:

header("Content-type:text/vnd.wap.wml");
  echo "<xml version="1.01"> "
  echo"<! DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN""http://www.wapforum.org//DTD//wml_1.1.xml"> ";

以上三行代码产生了WML文件(Deck)的文件头,这样WAP终端就可以识别所下载的Deck是否WML格式,并且接着显示余下的Deck内容。
  
  下面是一个最简单的Deck,它在WAP终端上显示”Hello World”。

<?xmlversion="1.0" encoding="ISO-8859-1"?> <! DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org//DTD//wml_1.1.xml">
  </xml>
  <!--Nokia Parser Info:Phone = Nokia 7110; Height = 90; Width = 130; CurrentDeckSize = 38; MaxDeckSize = 1600; CardsOnEachLine = 5; CardsVerticalGap = 30-->
  </card id="card1" ordered="true" newcontext="false">
  <p align="left">
  Hello World
  </p>
  </card>
  </wml>
<?php
  header("Content-type:text/vnd.wap.wml");
  echo "<?xml version="1.0"> ";
  echo "<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org//DTD//wml_1.1.xml"> ";
  echo " ";
  echo "<!--Nokia Parser Info: Phone = Nokia 7110; Height = 90; Width = 130; CurrentDeckSize = 38; MaxDeckSize = 1600; CardsOnEachLine = 5; CardsVerticalGap = 30--> ";
  echo "<card id="card1" ordered="true" newcontext="false"> ";
  echo "<p align="left"> ";
  echo "Hello World";
  echo "</p>";
  echo "</card>";
  echo "</wml>";
  ?>

我们建立的相应的PHP文件如下:

  我们可以将该文件存为index.php3,当WAP终端浏览该网站时,Web服务器会自动根据index.php3的内容产生如上所列的WML内容,并发送给网关进行处理。WAP终端收到该Deck后,将会在显示屏上显示”Hello World”的字样。
  
  以上是关于PHP在WAP中最简单的应用,它只是简单地产生若干行WML代码,并没有牵扯到数据库的访问。其实,PHP强大的功能可以为WAP提供很丰富的服务,而最值得挖掘的就是其强大的数据库支持,这些将在以后的文章中讨论。

使用PHP进行WAP开发详解2

进阶篇        

总体规划
实现 (1.数据和函数定义  2.对象实现 )

创建WAP页面
以后的工作
  附件

  PHP之于WAP,并不仅仅是靠几个”echo”语句向浏览器传送WML代码。PHP在WAP中较高端的应用,自然会牵扯到PHP的数据库操作和有关面向对象的编程知识。PHP是支持面向对象(OOP)的,这增强了PHP开发的持续性和开放性。当我们开发WAP页面时,如果利用PHP的面向对象特性,将使得代码更加灵活,通用性更高,体系更完整,层次更清晰,重用性也有所增加。
  
  这里,我们将讲述如何利用面向对象的编程方法进行PHP和WAP的开发。建议在阅读本之前先熟悉WML语法和PHP语法。
总体规划

  进行面向对象的编程自然需要确定对象以及对象之间的联系。对于需要开发的WAP页面,应该首先确定其中的模块或元素的种类,然后可以以种类为单位确定对象的个数。
  
  WAP浏览器下载的最小单位是Deck,一个Deck中可以包含若干个Card。为了简化设计,我们只考虑一个Card的情况。这样,Deck和Card的一一对应关系使得我们可以只为它们建议一个对象(如果考虑一个Deck包含若干个Card时,则需要分别为Deck和Card建立对象)。
  
  对于Card,其中可以包含文本(Test)、图象(Image)、表格(Table)、输入(Input)、链接(Hyperlink)等元素,对于这些元素需要分别建立对象。
  
  在实用中,一般需要建立PHP文件,当用户向服务器发出浏览该PHP文件的请求时,服务器将根据文件中的代码产生相应的HTML或WML内容,并发送给浏览器或WAP终端。
  
  继续细化,对于表格(Table),为了方便管理,我们可以建立行(Row)对象,而每个行对象中会包含若干个单元(Cell)对象,这里的单元对象可以是文本,也可以是图象,因此不需要另外定义。另外,对于输入(Input)、选择(Select)、动作(Do)等与服务器端交互的元素,我们为它们定义了一个父对象(Interact),将它们包含起来,方便理解与编程。
  
  如图1是我们建立的各种对象,其中的方框表示对象,而连线则表示包含关系,上层的对象包含下层的对象。

图1 PHP对象图
20130311143327_73682
对于具体对象的实现,需要遵循PHP的语法。对象中包含属性与方法,其中属性用来描述每个对象的特征,或者说,只要确定了属性,那么我们就确定了对象。对象中的方法描述了对象的操作,这些操作可以包括属性的设置、读取、显示等。因此,我们在实现以上所定义的对象时,需要提供完整的属性与必需的方法。
  
  举Deck的例子,如果要确定一个Deck(Card),我们需要知道它内部的所有元素,这些元素就是我们定义过的Image、Text等对象,因此Deck中应该包含有关这些对象的属性。另外,Deck还包含一些设置性的参数,如标题等,因此我们也可以为它定义”Title”属性等。就方法而言,我们所定义的对象中比较重要的方法是自构函数和创建函数。其中自构函数是指在创建一个对象(类)时所应完成的初始化,如设置标题头等;创建函数则产生有关该对象的WML代码,以组成一个完整的WML页面。在这里,面向对象的方法简化了创建函数,因为每个对象只用调用其属性(对象)的创建函数即可。如Deck对象要创建有关Table的代码时,则Deck中一定具有Table属性,那么直接调用Table的创建函数即可,同样,Table可以调用Row的创建函数,有些像对象的嵌套,这种机制无疑简化了开发过程。
  
  另外,对于Deck,由于它的属性可以是Text、Image、Table、Form、Link中的任一个,它就需要确定其每个属性的类型,以进行相应的处理。为了实现这点,可以在每个对象中定义一个获得该对象类型的方法,该方法(函数)返回一个标识以供Deck确认,例如,对于Text,可以使其返回0,对于Image,可以使其返回1等。对于Interact对象,也存在着与Deck相同的问题。
  
  在编写代码的过程中,我们应该尽量保持代码的可读性和可维护性,因此应尽量少使用无确切含义的数字和标识。例如上面所定义的返回值0或1,就难以让人理解。为了解决这个问题,我们可以使用define函数,将数字与一个符号对应,例如我们可以I_AM_TEXT表示0,I_AM_IMAGE表示1,从而增强了代码的可读性。
  
  对于所定义的对象,我们可以生成一个INC文件将其保存,供PHP文件调用以生成页面。这里需要明确一点,我们上面所述关于对象的实现并没有生成任何页面,它只是定义了我们生成页面所需要的元素和方法,而真正生成页面的工作是PHP文件完成的,它使用了我们所定义的元素。
  
  下面我们将讲述对象的具体实现。

  我们建立的相应的PHP文件如下:
实现 [TOP]

1.数据和函数定义 [TOP]

  在编写对象部分代码之前,我们需要进行准备工作,即定义必要的常量和函数。如上所述,为了提高代码的可读性,我们使用”define”语句定义了一系列常量,这些常量将在对象实现的代码中被引用。
 //定义对象类型

define("I_AM_TEXT",0); //文本
  define("I_AM_IMAGE",1); //图象
  define("I_AM_TABLE",2); //表格
  define("I_AM_FIELDSET",3); //交互元素
  define("I_AM_HYPERLINK",4); //链接
  define("I_AM_INPUT",5); //输入
  define("I_AM_SELECT",6); //选择
  define("I_AM_DO",7); //动作
  define("I_AM_ROW",8); //行
 
  //定义默认参数
  define("DEFAULT_TITLE","Welcome");//默认标题
 
  //定义页面格式
  define("ALIGN_LEFT",1); //居左
  define("ALIGN_RIGHT",2); //居右
  define("ALIGN_CENTER",3); //居中
 
  //定义文字格式
  define("TEXT_NORMAL",0); //普通
  define("TEXT_BOLD",1); //加粗
  define("TEXT_UNDERLINE",2); //下划线
  define("TEXT_ITALIC",4); //斜体
  define("TEXT_BIG",8); //大字体
  define("TEXT_SMALL",16); //小字体
 
  //定义Input元素类型
  define("INPUT_TEXT",0); //普通文本
  define("INPUT_PASSWORD",1); //密码
 
  //定义Select元素类型
  define("SELECT_NOT_MULTIPLE",0);//单选
  define("SELECT_MULTIPLE",1);//多选
 
  //定义Select元素选项的默认值
  define("SELECT_NOT_CHECKED", 0);
  define("SELECT_CHECKED", 1);

 除了以上的常量定义外,我们还需要定义函数”convert_character”。对于一些WML语言保留字符如”&”、”<"、">“等,以及ASCII码值大于160的符号,如果需要在浏览器端显示则必需进行处理。对于”<"等保留字符,需要将它们转化为"<"的格式,对于大于161的符号,需要将它们转化为"&#x;"(其中x表示符号的ASCII码值)的格式。由于定义了该函数,那么程序后面需要用到此功能时(事实证明经常用到)直接调用该函数即可。      该函数的实现如下:

//本函数实现特殊字符的转换
  //入口参数:字符串$words
  //出口参数:字符串&convert_ok
  function convert_character($words)
  {
  //将WML语言保留字符如"<"等转化为"<"格式
  $convert_words=htmlspecialchars($words);
  //将"m"等ASCII码大于160的字符转化为"&#x;"(x为其ASCII码值)的形式 for ($i=0; $i <strlen ($convert_words); $i++)
  {
  if (ord(substr($convert_words, $i, 1)) >= 160)
   $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";
  else
   $convert_ok.=substr($convert_words,$i,1);   
  }
 
  //返回转换后的字符串
  return($convert_ok);
  }

使用PHP进行WAP开发详解 3

2.对象实现
  我们将利用以上定义的常量和函数实现我们定义的若干对象。我们从上层对象开始,逐步向下实现,上层对象可以调用下层对象的方法。在实现过程中可以经常参考图1,明确对象的关系。
2.1 Deck对象的实现
2.2 Text对象的实现
2.3 Image对象的实现

2.4 Table对象的实现
2.5 Row对象的实现
2.6 Hyperlink对象的实现

2.7 Input对象的实现
2.8 Select对象的实现
2.9 Do对象实现

2.10 Fieldset对象的实现

2.1 Deck对象的实现 [TOP]
  首先确定Deck对象的属性,如表1所示。
属性名称 含义
$card_title 标题
$card_alignment 页面格式
$card_element Card所包含的元素,如Text、Table等
$element_number Card中所包含的元素数目
$default_item 变量及其默认值数组
$default_number 默认值数组元素数目
表1 Deck对象的属性
接着确定Deck对象的方法,如表2所示。
方法名(函数) 功能
My_Deck 自构函数,对象创建时被自动调用
Add_Element 加入元素,如Text、Image、Table、Hyperlink、Input、Select、Do等
Make_Deck 建立Deck(最关键的函数,它将最终产生需要的Deck)
表2 Deck对象的方法
  在我们所定义的函数中,比较复杂的是Add_Element函数和Make_Deck函数。
  
  Add_Element函数的入口参数为任何一种所定义的元素,如Text、Image等。函数开始先进行入口参数的检查,判断是否为合法对象,这种检查还会经常出现在后续的对象实现中。如果检查入口参数不是对象,则将出错退出。接下来判断入口参数是否为我们已经定义过的对象种类,如果是,则将其假如到card_element属性中,并使element_number计数器加1。如果入口参数是无法识别的对象,则程序报错退出。
  Make_Deck函数很复杂,我们按以下步骤实现:
  1.发送标头;
  2.产生Deck头代码;
  3.利用相应对象封装的get_defaults函数获取某些元素,如Select、Fieldset等中的变量的默认值(如果存在);
  4.如果缺省值存在,列出与缺省值相关的代码,即进入页面后自动刷新相应变量为缺省值;
  5.设置页面格式;
  6.对Deck中包含的每一个对象调用其封装的Make_Element函数产生各自的代码;
  7.产生Deck结束代码。
  
  虽然我们在此列出的步骤很简单,但是具体的实现却牵扯到很多细节,而这些实现需要编程人员对WML语言比较了解,特别是对Deck和Card的构造很熟悉。下面列出了其中比较复杂的获取变量默认值部分的代码和创建各元素部分代码的源程序,这两个部分体现了PHP语言面向对象编程的特点。
 //获取交互元素如Input,Select的一些变量默认值

while(list($thekey,$thevalue)=each($this->card_element))
  {
  switch($thevalue->My_Type())
  {
  case I_AM_SELECT:
  case I_AM_FIELDSET:
  {
  $temp_element=$thevalue;
 
  $temp_default=$temp_element->get_defaults();
  
  if($temp_default)
  {
   $this->default_item[$this->default_number]=$temp_default;
 
   $this->default_number++;
   break;
   }
   default:
   {
   break;
   }
  }
  }
 //产生相关元素各部分的代码
   for($i=0;$i<$this->element_number;$i++)
   {
   $the_element = $this->card_element[$i];
   switch ($the_element->My_Type())
   {
   case I_AM_TEXT:
   case I_AM_IMAGE:
   case I_AM_TABLE:
   case I_AM_HYPERLINK:
  case I_AM_INPUT:
  case I_AM_SELECT:
  case I_AM_DO:
  case I_AM_FIELDSET:
    {
    $temp_element = $this->card_element[$i];
 
    $temp_element->Make_Element(&$this);
 
    break;
   }
   default:
  {
  break;
  }
  }
  }
 

由于篇幅原因,细节实现不在此讨论,读者可以参阅所附的代码。

2.2 Text对象的实现 [TOP]
  Text对象是我们定义的第1个元素对象。它包含的属性和函数如下表所示:   
属性名称 含义
$text 文本内容
$attribute 文本格式属性
$br_count 文本后空行数目
表3 Text对象的属性
方法名(函数) 功能
My_Text 自构函数,对象创建时被自动调用
set_br_count 设置空行数目
My_Type 返回对象类别(I_AM_TEXT)
Make_Element 产生与Text对象相关的代码
表4 Text对象方法
  在各函数中,Make_Element函数将被Deck对象使用,My_Type函数也将被调用以供Deck对象确定本对象的类型。
  
  Make_Element对象的实现比较复杂,其相关代码如下所示。在代码中,首先产生有关Text格式的代码,然后再产生Text内容,最后产生代码结尾。
//创建Text部分代码

function Make_Element($deck)
  {
  if ($this->attribute & TEXT_BOLD)
  echo "<b>
";
 
   if ($this->attribute & TEXT_UNDERLINE)
  echo "<u>
";
 
  if ($this->attribute & TEXT_ITALIC)
  echo "<i>
";
 
  if ($this->attribute & TEXT_BIG)
  echo "<big>
";
  
  if ($this->attribute & TEXT_SMALL)
  echo "<small>
";
 
  if ($this->text)
  printf("%s
", convert_character($this->text));
 
  if ($this->attribute & TEXT_SMALL)
  echo "</small>
";
 
  if ($this->attribute & TEXT_BIG)
   echo "</big>
";
 
  if ($this->attribute & TEXT_ITALIC)
  echo "</i>
";
 
  if ($this->attribute & TEXT_UNDERLINE)
  echo "</u>
";
 
  if ($this->attribute & TEXT_BOLD)
   echo "</b>
";
 
  $br_command = "<br/>
";
  for ($i=0; $i<$this->br_count; $i++)
  echo $br_command;
  } 

2.3 Image对象的实现 [TOP]
  Image对象代表了图象元素,其包含的属性和方法如下表所示:
属性名称 含义
$wbmp_url 图片地址
$alt_text 图片文本描述(当图片无法显示时则显示文本)
$br_count 图片后空行数目
表5 Image对象的属性
方法名(函数) 含义
My_Image 自构函数,对象创建时被自动调用
set_br_count 设置空行数目
My_Type 返回对象类别(I_AM_IMAGE)
Make_Element 产生与Image对象相关的代码
表6 Image对象方法
本代码定义了PHP库,用于创建WAP页面
常量定义部分
函数定义部分
对象声明部分

常量定义部分

 //定义对象类型 
 
  define("I_AM_TEXT",0); //文本 
 
  define("I_AM_IMAGE",1); //图象 
 
  define("I_AM_TABLE",2); //表格 
 
  define("I_AM_INTERFACE",3); //交互元素 
 
  define("I_AM_HYPERLINK",4); //链接 
 
  define("I_AM_INPUT",5); //输入 
 
  define("I_AM_SELECT",6); //选择 
 
  define("I_AM_DO",7); //动作 
 
  define("I_AM_ROW",8); //行 
 
 
 
  //默认参数 
 
  define("DEFAULT_TITLE","Welcome") 
 
  //定义页面格式 
 
  define("ALIGN_LEFT",1); //居左 
 
  define("ALIGN_RIGHT",2); //居右 
 
  define("ALIGN_CENTER",3); //居中 
 
 
 
  //定义文字格式 
 
  define("TEXT_NORMAL",0); //普通 
 
  define("TEXT_BOLD",1); //加粗 
 
  define("TEXT_UNDERLINE",2); //下划线 
 
  define("TEXT_ITALIC",4); //斜体 
 
  define("TEXT_BIG",8); //大字体 
 
  define("TEXT_SMALL",16); //小字体 
 
 
 
  //定义Input元素类型 
 
  define("INPUT_TEXT",0); //普通文本 
 
  define("INPUT_PASSWORD",1); //密码 
 
 
 
  //定义Select元素类型 
 
  define("SELECT_NOT_MULTIPLE",0);//单选 
 
  define("SELECT_MULTIPLE",1);//多选 
 
 
 
  //定义Select元素选项的默认值 
 
  define("SELECT_NOT_CHECKED", 0); 
 
  define("SELECT_CHECKED", 1);

函数定义部分 [TOP]

//本函数实现特殊字符的转换 <br>
  //入口参数:字符串$words <br>
  //出口参数:字符串&convert_ok <br>
  function convert_character($words)<br>
   { <br>
  //将WML语言保留字符如"<"等转化为"<"格式 <br>
  $convert_words=htmlspecialchars($words); <br>
<br>
  //将"m"等ASCII码大于160的字符转化为" "(x为其ASCII码值)的形式<br>
for ($i=0; $i<strlen($convert_words); $i++) 
 
  { 
 
  if (ord(substr($convert_words, $i, 1)) >= 160) 
 
    $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";
 
   else
 
    $convert_ok.=substr($convert_words,$i,1); 
 
    }   //返回转换后的字符串
 
   return($convert_ok); 
 
2.4 Table对象的实现 
 
  Table对象代表了表格元素,其包含的属性和方法如下表所示: 
 
属性名称    含义
 
$table_row    表格所包含的行,为Row对象的数组
 
$row_number    表格所包含的行的数目
 
表7 Table对象的属性 
 
方法名(函数)    含义
 
My_Table    自构函数,对象创建时被自动调用
 
add_row    加入新行
 
My_Type    返回对象类别(I_AM_TABLE)
 
Make_Element    产生与Table对象相关的代码
 
表8 Table对象方法 
 
 
 
  表格对象与Text与Image对象不太一样,它其中还包含了子对象Row,所以它创建代码时会调用子对象Row的Make_Element函数。Table的Make_Element函数代码如下所示:
 
 //创建Table部分代码
<pre class="brush:php">  function Make_Element($deck) 
 
  { 
 
  $max_column_number = 0; 
 
  for ($i = 0; $i < $this->row_number; $i++) 
 
   { 
 
  $the_row = $this->table_row[$i]; 
 
  $column_number = $row->get_column_number(); 
 
  if ($column_number > $max_column_number) 
 
  $max_column_number = $column_number; 
 
  } 
 
  printf("<table columns="%d">
", $max_column_number);
 
  for ($i = 0; $i < $this->row_number; $i++) 
 
  { 
 
  $the_row = $this->table_row[$i]; 
 
  $the_row->Make_Element(&$deck); 
 
   } 
 
 
 
   echo "</table></br>
";
 
  } </pre>
<br>
<br>
2.5 Row对象的实现 [TOP] <br>
  Row对象是Table对象的属性之一,它所包含的属性与方法如下表所示: <br>
属性名称    含义<br>
$column    行所包含的单元格,是一个数组,元素值可为Text或Image对象<br>
$column_number    行所包含的单元格数目<br>
表9 Row对象的属性<br>
方法名(函数)    功能<br>
My_Row    自构函数,对象创建时被自动调用<br>
Add_Element    加入单元格<br>
get_column_number    返回单元格数目<br>
My_Type    返回对象类别(I_AM_ROW)<br>
Make_Element    产生与Row对象相关的代码<br>
表10 Row对象的方法<br>
<br>
  由于Row所包含的单元格也是我们所定义的Text和Image等对象,因而在创建其代码是会调用Text或Image对象的Make_Element函数。 <br>
  <br>
  "Deck--Table--Row--Text(Image)",这种包含关系体现了面向对象的编程观点,条理清晰,降低了设计难度。 <br>
<br>
2.6 Hyperlink对象的实现 [TOP] <br>
  Hyperlink对象代表了Deck所包含的超级链接,其属性和方法如下表所示: <br>
属性名称    含义<br>
$link_lable    链接标记<br>
$link_url    链接地址<br>
表11 Hyperlink对象的属性<br>
方法名(函数)    功能<br>
My_Hyperlink    自构函数,对象创建时被自动调用<br>
My_Type    返回对象类别(I_AM_HYPERLINK)<br>
Make_Element    产生与Hyperlink对象相关的代码<br>
表12 Hyperlink对象的方法<br>
<br>
  Hyperlink对象的实现很简单,这里不再讲解,可以参考所附代码。<br>
2.7 Input对象的实现 [TOP] <br>
  Input对象代表了Deck元素中获取用户输入的元素,其属性和方法如下表所示: <br>
属性名称    含义<br>
$input_name    输入域的名称<br>
$input_value    输入的值<br>
$input_lable    输入域的标记<br>
$input_size    输入域的大小<br>
$input_maxlength    输入域的最大长度<br>
$input_type    输入的类型<br>
$input_format    输入的格式<br>
表13 Input对象的属性<br>
方法名(函数)    功能<br>
My_Input    自构函数,对象创建时被自动调用<br>
set_size    设置$input_size<br>
set_maxlength    设置$input_maxlength<br>
get_name    获得$input_name<br>
get_value    获得$input_value<br>
get_lable    获得$input_lable<br>
get_size    获得$input_size<br>
get_maxlength    获得$input_maxlength<br>
get_format    获得$input_formant<br>
My_Type    返回对象类别(I_AM_INPUT)<br>
Make_Element    产生与Input对象相关的代码<br>
表14 Input对象的方法<br>
<br>
  Input对象多了很多设置属性和获取属性的函数,这是为了其它函数的使用。Input对象的Make_Element对象的实现与以上对象大同小异,这里不再列举。<br>
2.8 Select对象的实现 <br>
  Select对象类似于HTML中的Radio和Checkbox,其包含的属性和方法如下表所示: <br>
属性名称    含义<br>
$select_name    选择域的名称<br>
$select_value    选择域的值<br>
$select_option    选择域的选项<br>
$option_number    选项的数目<br>
$select_multiple    是否允许多选<br>
$select_default    默认值<br>
表15 Select对象的属性<br>
方法名(函数)    功能<br>
My_Select    自构函数,对象创建时被自动调用<br>
set_multiple    设置允许多选<br>
get_name    获得$select_name<br>
get_value    获得$select_value<br>
add_option    加入新的选项<br>
get_defaults    获得$select_defaults,即获得默认值<br>
My_Type    返回对象类别(I_AM_SELECT)<br>
Make_Element    产生与Select对象相关的代码<br>
表16 Select对象的方法<br>
  在Select对象中,比较特殊的是add_option函数,该函数不仅实现添加选项,而且也根据入口参数,设定$select_default。由于单选和多选的$select_default不同,因此需要分开实现。对于多选,允许同时选择多个默认值值,这时默认值的格式为"默认值1;默认值2;默认值3;...."。关于add_option的代码如下所示: <br>
//加入Option<br>
<pre class="brush:php"> function add_option($label, $value,$checkit=SELECT_NOT_CHECKED) 
 
  { 
 
  if (!$label || !$value) 
 
    die("Incorrect option,Quit"); 
 
 
 
   $this->select_option[$this->option_number]["label"] = $label; 
 
   $this->select_option[$this->option_number]["value"] = $value; 
 
 
 
   if(!$this->select_multiple) 
 
  { 
 
  if($this->select_value==""||$checkit) 
 
  { 
 
  $this->select_value=value; 
 
  $this->select_default ["name"]=$this->select_name; 
 
  $this->select_default ["value"]=$this->select_value; 
 
   } 
 
  } 
 
  else
 
  { 
 
  if($checkit) 
 
  { 
 
  if($this->select_value=="") 
 
   $this->select_value=$value
 
  else
 
   $this->select_value.=";".$value; 
 
  $this->select_default ["name"]=$this->select_name; 
 
  $this->select_default ["value"]=$this->select_value; 
 
   } 
 
  }
 
  $this->option_number++; 
 
 } 
 
  由于多数的工作已由add_option完成,因此get_defaults函数很简单,只需返回$select_default即可,代码如下所示: 
 
 //获得变量默认值
 
  function get_defaults() 
 
  { 
 
  return $this->select_default; 
 
  }</pre>
<br>
2.9 Do对象实现 <br>
  我们这里定义的Do对象,主要完成Input、Select、Fieldset等元素的变量的传递,即当激发Do元素后,会将我们的输入和选择发送给服务器进行处理。Do对象的属性和方法如下表所示:<br>
属性名称    含义<br>
$do_name    do的名称<br>
$do_lable    do的标记<br>
$do_var    do所要传递的变量<br>
$do_url    将变量发送到的地址<br>
表17 Do对象的属性<br>
方法名(函数)    功能<br>
My_Do    自构函数,对象创建时被自动调用<br>
set_var    设置$do_var<br>
set_url    设置$do_url<br>
get_name     获得$do_name<br>
My_Type    返回对象类别(I_AM_DO)<br>
Make_Element    产生与Do对象相关的代码<br>
表18 Do对象的方法<br>
<br>
  Do中Make_Element的实现需要开发人员对Do的组成比较了解,其中难点在代码的实现一般而言,代码的格式为: <go herf="发送到的地址?变量名1=$(变量值1)&变量名2=$(变量值2)&...... "><br>
  <br>
  针对的格式,Do对象的Make_Element函数的代码如下所示: <br>
//产生Do部分的代码<br>
<pre class="brush:php"> function Make_Element($deck) 
 
  { 
 
  while (list($key, $value) = each($this->do_var))
 
    $the_var.= $value."=$(".$value.")&";
 
 
 
  if ($this->do_name != "") 
 
  $the_var.=$this->do_name."=".$this->do_label; 
 
 
 
  if (substr($the_var, -5) == "&") 
 
  $the_var = substr($the_var, 0, strlen($the_var)-5); 
 
 
 
  printf("
", $this->do_label); 
 
  printf("
", $this->do_url, $the_var); 
 
 
 
  echo "
"; 
 
  echo "
"; 
 
  } </pre>
<br>
<br>
<!--?php echo htmlspecialchars();?--> 

使用PHP进行WAP开发详解 4

2.10 Fieldset对象的实现
  Fieldset对象比较特殊,它将Text、Image、Input等其它元素组织在一起,以便于浏览器显示。因此Fieldset对象在某些实现方法上与Deck相同。Fieldset对象的属性与方法如下表所示:
属性名称 含义
$fieldset_title fieldset的标题
$fieldset_element fieldset所包含的元素
$element_number fieldset所包含的元素的数目
表19 Fieldset对象的属性
方法名(函数) 功能
My_Fieldset 自构函数,对象创建时被自动调用
Add_Element 加入新元素
get_defaults 获取变量默认值
My_Type 返回对象类别(I_AM_FIELDSET)
Make_Element 产生与Fieldset对象相关的代码
表20 Fieldset对象的方法
  在Fieldset所包含的函数中,除get_defaults与My_Type之外,其它的实现方法同Deck对象基本相同,这是由于两者的结构类似的缘故。但是Fieldset毕竟是Deck对象的一部分,因此它还需要向Deck对象传送一些参数。
  Fieldset的get_defaults函数的实现方法也利用了面向对象的特点,它调用其元素Select的get_defaults函数从而获得默认值,该部分代码如下所示:
//获取变量默认值

 
function get_defaults()
 {
 $i = 0;
 while (list($key, $value) = each($this->fieldset_element))
 {
 switch ($value->My_Type())
  {
 case I_AM_SELECT:
  {
  if($value->get_defaults())
 {
 $temp_default=$value->get_defaults();
 $fieldset_default[$i]=$temp_default;
 $i++;
  }
 }
  break;
 }
 default:
 {
   break;
  }
  }
   }
 return fieldset_default;
  }

 以上是关于所有对象的实现,需要注意的是,代码中我们所定义的对象名称为”My_对象名”的格式,如Text对象的名称为”My_Text”。
  
  以上我们所定义的对象全部包含在了文件”my_wap.inc”中,以供php文件调用。
创建WAP页面 [TOP]

  我们将利用”my_wap.inc”文件来创建WAP页面。我们需要建立一个文件”my_wap.php3″,当浏览器访问该文件时,它将产生WML代码,发送到浏览器并显示出来。该部分代码如下所示:
//本代码获取用户输入,并在用户确认后发出欢迎信息<br>   require( "my_wap.inc");//包含所定义的各种对象<br>   $Demo_Card = new My_Deck( "Introduce Yourself");//建立一个Deck对象<br> <br>   $Demo_Text = new My_Text("Welcom to my home",TEXT_BOLD); //建立文本<br>   $Demo_Text->set_br_count(1); //文本后加入1个空行<br>   $Demo_Card->Add_Element($Demo_Text);//加入该文本<br> <br>   if (!$submit)//如果未点击过submit<br>   {<br> <br>   $Demo_Input = new My_Input( "yourname", "", "Your Name", "*M");//建立一个Input对象<br>   $Demo_Input->set_size(10);<br>   $Demo_Input->set_maxlength(10);<br> <br>   $getvar[0]="yourname"; <br>   $Demo_Do = new My_Do( "submit", "Submit",$getvar,"$PHP_SELF");//建立一个Do对象<br> <br>   $Demo_Card->Add_Element($Demo_Input);//加入Input对象<br>   $Demo_Card->Add_Element($Demo_Do);//加入Do对象<br>   $Demo_Card->Make_Deck();//创建页面<br>   }<br>   else //如果已经点击过submit<br>   {<br>    $Demo_Text2 = new My_text("Nice to meet you,$yourname"); //建立文本<br>    $Demo_Card->Add_Element($Demo_Text2);//加入该文本<br>    $Demo_Card->Make_Deck();//创建页面<br>   }<br>   <br>   ?>

我们可以看到,当用户第一次进入该页面时,将进入”If”语句的第一个分支,在那里显示了一个Input域,用户输入自己的姓名后,点击Do元素”Submit”。之后”$submit”将被置为有值(”Submit”),并将”$getvar”中的变量发送给页面”$PHP_SELF”,这里”$PHP_SELF”为PHP环境变量,表示本页面。因此用户点击”Submit”后,重新进入了该页面,但由于此时”$submit”变量不为0,因此用户进入”If”语句的第2个分支。在这里,程序将用户名字显示出来,并发出欢迎信息。
以后的工作 [TOP]

  以上的代码实现了通过PHP动态创建WAP页面的功能,并且利用了面向对象的方法,将各元素进行了封装,进行有层次的开发,隐藏了WML语言的细节,增加了灵活性,简化了页面的创建。
  
  今后,我们还可以继续维护代码,由于我们采用了面向对象编程方法,当我们需要增加新功能时,并不用对代码进行太多修改。
  
  我们可以将目前的”My_Deck”类改为”My_Card”类,而创建一个新类”My_Deck”,从而实现一个Deck中包含多个Card。
  
  另外,我们可以根据PHP的环境变量的一些环境变量,判断用户的浏览器类型,从而动态产生HTML页面或者WML页面,使得各种终端用户都可访问本站点。
  
  如果服务器上安装了MySQL等数据库,那么PHP与MySQL的搭配更会使得程序开发如虎添翼,这样就可以在WAP页面中增加更多的功能和服务。
  
  以上这些我们可以留待以后分析。
本代码定义了PHP库,用于创建WAP页面
常量定义部分
函数定义部分
对象声明部分

常量定义部分
//定义对象类型

define("I_AM_TEXT",0); //文本 <br>
  define("I_AM_IMAGE",1); //图象 <br>
  define("I_AM_TABLE",2); //表格 <br>
  define("I_AM_INTERFACE",3); //交互元素 <br>
  define("I_AM_HYPERLINK",4); //链接 <br>
  define("I_AM_INPUT",5); //输入 <br>
  define("I_AM_SELECT",6); //选择 <br>
  define("I_AM_DO",7); //动作 <br>
  define("I_AM_ROW",8); //行 <br>
<br>
  //默认参数 <br>
  define("DEFAULT_TITLE","Welcome") <br>
  //定义页面格式 <br>
  define("ALIGN_LEFT",1); //居左 <br>
  define("ALIGN_RIGHT",2); //居右 <br>
  define("ALIGN_CENTER",3); //居中 <br>
<br>
  //定义文字格式 <br>
  define("TEXT_NORMAL",0); //普通 <br>
  define("TEXT_BOLD",1); //加粗 <br>
  define("TEXT_UNDERLINE",2); //下划线 <br>
  define("TEXT_ITALIC",4); //斜体 <br>
  define("TEXT_BIG",8); //大字体 <br>
  define("TEXT_SMALL",16); //小字体 <br>
<br>
  //定义Input元素类型 <br>
  define("INPUT_TEXT",0); //普通文本 <br>
  define("INPUT_PASSWORD",1); //密码 <br>
<br>
  //定义Select元素类型 <br>
  define("SELECT_NOT_MULTIPLE",0);//单选 <br>
  define("SELECT_MULTIPLE",1);//多选 <br>
<br>
  //定义Select元素选项的默认值 <br>
  define("SELECT_NOT_CHECKED", 0); <br>
  define("SELECT_CHECKED", 1); <br>
<br>
<br>
 函数定义部分 [TOP]<br>
  //本函数实现特殊字符的转换 <br>
  //入口参数:字符串$words <br>
  //出口参数:字符串&convert_ok <br>
  function convert_character($words)<br>
   { <br>
  //将WML语言保留字符如"<"等转化为"<"格式 <br>
  $convert_words=htmlspecialchars($words); <br>
<br>
  //将"m"等ASCII码大于160的字符转化为" "(x为其ASCII码值)的形式<br>
  for ($i=0; $i<strlen($convert_words); $i++) <br>
  { <br>
  if (ord(substr($convert_words, $i, 1)) >= 160) <br>
    $convert_ok.="&#".ord(substr($convert_words,$i,1)).";";<br>
   else<br>
    $convert_ok.=substr($convert_words,$i,1); <br>
    }<br>
<br>
   //返回转换后的字符串<br>
   return($convert_ok); <br>
 对象声明部分<br>
1.Deck对象声明<br>
2.Text对象声明 <br>
3.Image对象声明<br>
4.Table对象声明<br>
<br>
5.Row对象声明<br>
6.Hyperlink对象声明<br>
7.Input对象声明<br>
8.Select对象声明<br>
<br>
9.Do对象声明<br>
10.Fieldset对象声明<br>
      <br>
<br>
1.Deck对象声明 [TOP] <br>
class My_Deck <br>
   { <br>
  //属性声明<br>
  var $card_title;<br>
  var $card_alignment;<br>
  var $element_number;<br>
  var $default_item;<br>
  var $default_number;<br>
<br>
  //自构函数 <br>
  function My_Deck($title=DEFAULT_TITLE, $align=ALIGN_LEFT)<br>
  {<br>
  if ($title != DEFAULT_TITLE)<br>
   $this->card_title = $title;<br>
<br>
   $this->align = $alignment;<br>
   $this->card_timer = 0;<br>
   $this->forward_url = ""; <br>
<br>
   $this->element_number = 0;<br>
   $this->default_number = 0;<br>
  }<br>
<br>
  //添加元素<br>
  function Add_Element($element)<br>
  { <br>
  if (!is_object($element)) <br>
    die("Unlegal Element,Quit"); <br>
  switch($element->My_Type())<br>
   {<br>
  case I_AM_TEXT:<br>
  case I_AM_IMAGE:<br>
  case I_AM_TABLE:<br>
  case I_AM_HYPERLINK:<br>
  case I_AM_INPUT:<br>
  case I_AM_SELECT:<br>
  case I_AM_DO:<br>
  case I_AM_FIELDSET: <br>
   {<br>
    $this->card_element[$this->element_number] = $element;<br>
<br>
   $this->element_number++;<br>
<br>
    break;<br>
    }<br>
   default:<br>
    { <br>
    die("Unlegal Element,Quit"); <br>
    }<br>
    }<br>
   }<br>
  <br>
  //创建Deck<br>
   function Make_Deck()<br>
  { <br>
  header("content-type: text/vnd.wap.wml");<br>
<br>
   echo "<?xml version="1.0"?>
";<br>
   echo "<!DOCTYPE xml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
";<br>
   printf("<-- Generated by %s %s -->
", HAW_VERSION, HAW_COPYRIGHT);<br>
<br>
   echo " <br>
<wml>
"; <br>
<br>
   $title = "title="$this->title"";<br>
<br>
   printf("<card%s>
", $title); <br>
<br>
  //获取交互元素如Input,Select的一些变量默认值<br>
  while(list($thekey,$thevalue)=each($this->card_element))<br>
  {<br>
  switch($thevalue->My_Type())<br>
  {<br>
   case I_AM_SELECT:<br>
   case I_AM_FIELDSET: <br>
   { <br>
   $temp_element=$thevalue;<br>
<br>
   $temp_default=$temp_element->get_defaults(); <br>
<br>
   if($temp_default)<br>
    {<br>
    $this->default_item[$this->default_number]=$temp_default;<br>
<br>
    $this->default_number++; <br>
<br>
    break; <br>
    } <br>
    default:<br>
     {<br>
    break;<br>
     }<br>
   }<br>
  }<br>
  if ($this->default_number) <br>
   {<br>
   //缺省值存在 <br>
   echo "<onevent type="onenterforward">
";<br>
   echo "
"; <br>
<br>
  // 列出缺省值<br>
  for($i=0;$i<$this->default_number;$i++)<br>
  {<br>
  while (list($thekey, $thevalue) = each($this->default_item[$i]))<br>
  printf("<setvar name="%s" value="%s"/>
", $thevalue["name"], $thevalue["value"]);<br>
    }<br>
<br>
  echo "</refresh>
"; <br>
  echo "</onevent>
";<br>
<br>
  //后向进入页面时变量默认值也需重新设置,实现方法与以上相同 <br>
  echo "<onevent type="onenterbackward">
";<br>
  echo "<refresh>
";<br>
<br>
  // 列出缺省值 <br>
  for($i=0;$i<$this->default_number;$i++) <br>
   { <br>
  while (list($thekey, $thevalue) = each($this->default_item[$i]))<br>
  printf("<setvar name="%s" value="%s"/>
", $thevalue[name], $thevalue[value]);<br>
   }<br>
  echo "</refresh>
"; <br>
  echo "</onvent>
"; <br>
  }<br>
<br>
  //设置页面格式<br>
  switch ( $this->card_align )<br>
  {<br>
  case ALIGN_LEFT:<br>
   {<br>
   echo "</p>
";<br>
   break;<br>
   }<br>
<br>
  case ALIGN_CENTER:<br>
  {<br>
  echo "<p align="center"> 
";<br>
  break;<br>
   }<br>
<br>
  case ALIGN_RIGHT:<br>
  {<br>
  echo "<p align="right"> 
";<br>
<br>
  break;<br>
  }<br>
  } <br>
<br>
  for($i=0;$i<$this->element_number;$i++)<br>
  {<br>
   $the_element = $this->card_element[$i];<br>
   switch ($the_element->My_Type())<br>
    {<br>
    case I_AM_TEXT:<br>
    case I_AM_IMAGE: <br>
    case I_AM_TABLE:<br>
    case I_AM_HYPERLINK:<br>
  case I_AM_INPUT:<br>
  case I_AM_SELECT:<br>
  case I_AM_DO:<br>
  case I_AM_FIELDSET:<br>
    {<br>
    $temp_element = $this->card_element[$i];<br>
 <br>
    $temp_element->Make_Element(&$this);<br>
<br>
    break;<br>
    }<br>
   default:<br>
   { <br>
   break; <br>
   }<br>
    }<br>
   }<br>
<br>
  echo " </p>
"<br>
  echo "</card> 
";<br>
  echo "</wml> 
";<br>
<br>
  }; <br>
2.Text对象声明 <br>
class My_Text <br>
  { <br>
  //属性声明 <br>
   var $text;<br>
   var $attribute;<br>
   var $br_count;//空行数目 <br>
<br>
  //方法声明<br>
  <br>
  //自构函数<br>
  function My_Text($the_text, $the_attribute=TEXT_NORMAL)<br>
  {<br>
   $this->text = $the_text; <br>
   $this->attribute = $the_attribute; <br>
   $this->br_count = 1; <br>
  }<br>
<br>
  //设置空行数目函数<br>
  function set_br_count($the_br_count)<br>
  {<br>
   if (!is_int($the_br_count) || ($br < 0))<br>
    die("incorrect br_count");<br>
<br>
   $this->br_count = $the_br_count; <br>
  } <br>
<br>
  //返回对象类型函数<br>
   function My_Type()<br>
  {<br>
  return I_AM_TEXT;<br>
  }<br>
<br>
  //创建Text部分代码<br>
  function Make_Element($deck)<br>
  {<br>
   if ($this->attribute & TEXT_BOLD) <br>
    echo "<b>n";<br>
<br>
   if ($this->attribute & TEXT_UNDERLINE)<br>
    echo "<i>n";<br>
<br>
  if ($this->attribute & TEXT_BIG) <br>
    echo "<big>
"; <br>
<br>
   if ($this->attribute & TEXT_SMALL)<br>
   echo "<small>
"; <br>
<br>
  if ($this->text) <br>
   rintf("%s
", convert_character($this->text));<br>
<br>
  if ($this->attribute & TEXT_SMALL)<br>
   echo "</small>
"; <br>
<br>
  if ($this->attribute & TEXT_BIG) <br>
   echo "</bigl>
";<br>
<br>
  if ($this->attribute & TEXT_ITALIC) <br>
   echo "</i>
"; <br>
<br>
  if ($this->attribute & TEXT_UNDERLINE)<br>
   echo "</u>
"; <br>
  if ($this->attribute & TEXT_BOLD)<br>
   echo "</b>
"; <br>
<br>
   $br_command = "<br/>
"; <br>
  for ($i=0; $i<$this->br_count; $i++) <br>
   echo $br_command; <br>
<br>
3.Image对象声明 [TOP] <br>
class My_Image<br>
  {<br>
  //属性声明<br>
  var $wbmp_url;<br>
  var $alt_text;<br>
  var $br_count;//空行数目<br>
<br>
  //方法声明<br>
<br>
  //自构函数<br>
  function My_Image($url, $text)<br>
  {<br>
   $this->wbmp_url = $url;<br>
   $this->alt_text = $text;<br>
   $this->br_count = 0;<br>
   }<br>
<br>
  //设置空行数目 <br>
  function set_br_count($count)<br>
  {<br>
   if (!is_int($count) || ($count < 0))<br>
    die("incorrect br_count,Quit");<br>
<br>
   $this->br_count = $count;<br>
  }<br>
<br>
  //返回对象类型<br>
  function My_Type()<br>
  {<br>
   return I_AM_IMAGE;<br>
   }<br>
  <br>
  //创建Image部分代码<br>
  function Make_Element($deck)<br>
  {<br>
   printf("<image src="%s" alt="%s"/>
", $this->wbmp_url, $this->alt_text);<br>
<br>
  $br_command = "<br/>
"; <br>
  for ($i=0; $i < $this->br_count; $i++)<br>
    echo $br_command;<br>
    } <br>
   } <br>
   } <br>
4.Table对象声明 [TOP] <br>
class My_Table <br>
  { <br>
  //属性声明<br>
  var $table_row;<br>
  var $row_number;<br>
<br>
  //方法声明<br>
<br>
  //自构函数<br>
  function My_Table()<br>
  {<br>
   $this->row_number = 0;//初始化为0行<br>
   }<br>
<br>
  //加入新行<br>
  function add_row($new_row)<br>
  {<br>
   if (!is_object($new_row)||$new_row->My_Type()!=I_AM_ROW)<br>
    die("incorrect row,Quit");<br>
<br>
  $this->table_row[$this->row_number] = $new_row;<br>
<br>
  $this->row_number++; <br>
<br>
   }<br>
<br>
  //返回对象类型<br>
  function My_Type()<br>
   { <br>
   return I_AM_TABLE; <br>
   }<br>
<br>
   //创建Table部分代码 <br>
   function Make_Element($deck)<br>
   {<br>
   $max_column_number = 0;<br>
   for ($i = 0; $i < $this->row_number; $i++)<br>
    {<br>
    $the_row = $this->table_row[$i];<br>
    $column_number = $row->get_column_number();<br>
    if ($column_number > $max_column_number)<br>
     $max_column_number = $column_number;<br>
     }<br>
<br>
    printf("<table columns="%d">
", $max_column_number);<br>
   for ($i = 0; $i < $this->row_number; $i++) <br>
    { <br>
    $the_row = $this->table_row[$i];<br>
    $the_row->Make_Element(&$deck);<br>
    }<br>
<br>
     echo "</table><br/>
"; <br>
     }<br>
    }; <br>
<br>
5.Row对象声明 [TOP] <br>
 {<br>
  //属性声明<br>
  var $column;<br>
  var $column_number;<br>
<br>
   //方法声明<br>
<br>
  //自构函数<br>
  function My_Row()<br>
  {<br>
    $this->column_number = 0;//初始化为0单元<br>
  }<br>
  //加入单元<br>
  function Add_Element($cell_element=NULL)<br>
  {<br>
   if (is_object($cell_element))<br>
   {<br>
   if (($cell_element->My_Type() == HAW_PLAINTEXT) ||<br>
     ($cell_element->My_Type() == HAW_IMAGE)) <br>
    { <br>
   $this->column[$this->column_number]=$cell_element;<br>
   $this->column_number++;<br>
   }<br>
  else<br>
   die("Incorrect column,Quit");<br>
    }<br>
<br>
   if ($cell_element==NULL) <br>
   {<br>
   $this->column[$this->column_number]=$cell_element;<br>
   $this->column_number++; <br>
    }<br>
<br>
   }<br>
<br>
  //获取单元数目<br>
   function get_column_number()<br>
   {<br>
    return $this->column_number;<br>
   } <br>
<br>
   //返回对象类型<br>
   function My_Type()<br>
   {<br>
    return I_AM_ROW;<br>
    }<br>
<br>
    //创建Row部分代码<br>
     function Make_Element($deck)<br>
    {<br>
     echo "<tr>
"; <br>
<br>
    for ($i = 0; $i < $this->column_number; $i++)<br>
<br>
    {<br>
    echo "<td>
";<br>
<br>
    $the_column = $this->column[$i];<br>
    if (is_object($the_column))<br>
     $the_column->Make_Element(&$deck);<br>
<br>
    echo "</td>
";<br>
    }<br>
   <br>
    echo "</tr>
"; <br>
     }<br>
   }; <br>
6.Hyperlink对象声明 <br>
class My_Hyperlink <br>
  {<br>
   //属性声明<br>
   var $link_label; <br>
   var $link_url; <br>
<br>
   //方法声明 <br>
<br>
   //自构函数<br>
   function My_Hyperlink($label, $url)<br>
   {<br>
    $this->link_label = $label;<br>
    $this->link_url = $url;<br>
    }<br>
<br>
   //返回对象类型<br>
   function My_Type()<br>
   {<br>
    return I_AM_HYPERLINK;<br>
   }<br>
<br>
   //创建Hyperlink部分代码<br>
   function Make_Element($deck)<br>
   {<br>
   printf"<a herf="%s">%s</a><br/>
", convert_character($this->link_url), convert_character($this->link_label)); <br>
   } <br>
  }; <br>
<br>
7.Input对象声明 [TOP] <br>
class My_Input<br>
  {  <br>
   //属性声明<br>
   var $input_name;<br>
  var $input_value; <br>
  var $input_label;<br>
  var $input_size;<br>
  var $input_maxlength;<br>
  var $input_type;<br>
  var $input_format;<br>
<br>
  //方法声明 <br>
  <br>
  //自构函数<br>
   function My_Input($name, $value, $label, $type=INPUT_TEXT, $format="*M") <br>
   $this->input_name = $name; <br>
   $this->input_value = $value;<br>
   $this->input_label = $label;<br>
   $this->input_format = $format;<br>
   $this->type = $type;<br>
   }<br>
<br>
    //设定大小<br>
   function set_size($size)<br>
   {<br>
   $this->input_size = $size;<br>
    }<br>
    //设定最大长度<br>
    function set_maxlength($maxlength)<br>
    {<br>
    $this->input_maxlength = $maxlength;<br>
     }<br>
   //返回名称<br>
    function get_name()<br>
   {<br>
    return $this->input_name; <br>
    }<br>
<br>
   //返回值<br>
   function get_value()<br>
   {<br>
   return $this->input_value;<br>
    }<br>
<br>
   //返回标签<br>
   function get_label()<br>
   {<br>
   return $this->input_label;<br>
    }<br>
<br>
   //返回大小<br>
    function get_size()<br>
   {<br>
    return $this->input_size;<br>
   }<br>
   <br>
   //返回最大长度<br>
   function get_maxlength()<br>
   {<br>
    return $this->input_maxlength;<br>
   }<br>
   //返回类型<br>
    function get_type()<br>
   {<br>
   return $this->input_type;<br>
    }<br>
<br>
    //返回格式<br>
   function get_format()<br>
   {<br>
    return $this->input_format;<br>
    }<br>
<br>
   //返回对象类型<br>
   function My_Type()<br>
   {<br>
     return I_AM_INPUT;<br>
   }<br>
<br>
   //创建Input部分代码<br>
   function Make_Element($deck)<br>
    {<br>
   if ($this->input_type == INPUT_TEXT)<br>
    $type = "type="text"";<br>
   else<br>
    $type = "type="password"";<br>
<br>
    if ($this->input_size)<br>
      $size = sprintf("size="%d"", $this->input_size);<br>
<br>
   if ($this->input_maxlength)<br>
     $maxlength = sprintf("maxlength="%d"", $this->input_maxlength);<br>
   <br>
    printf("%s:<input format="%s" %s name="%s" value="%s" %s %s/>
",<br>
        convert_character($this->input_label), $this->input_format, $type, <br>
       $this->input_name,$this->input_value, $size, $maxlength); <br>
     }<br>
   }; <br>
8.Select对象声明 <br>
 class My_Select <br>
   { <br>
   //属性声明<br>
   var $select_name;<br>
   var $select_value;<br>
   var $select_option;<br>
   var $option_number;<br>
   var $select_multiple;<br>
   var $select_default<br>
<br>
   //方法声明<br>
<br>
   //自构函数<br>
   function My_Select($name) <br>
   { <br>
   $this->select_name = $name;<br>
     $this->select_value="";<br>
   $this->option_number = 0;//初始化为空<br>
   $select_multiple = SELECT_NOT_MULTIPLR;//初始化为单选<br>
   }<br>
<br>
   //设置多选<br>
   function set_multiple()<br>
   {<br>
    $this->select_multiple=SELECT_MULTIPLE;<br>
    }<br>
<br>
   //返回名称<br>
   function get_name()<br>
   {<br>
    return $this->select_name;<br>
   }<br>
   <br>
   //返回值<br>
   function get_value()<br>
   {<br>
   return $this->select_value;<br>
    }<br>
<br>
   //加入Option<br>
   function add_option($label, $value,$checkit=SELECT_NOT_CHECKED)<br>
   {<br>
    if (!$label || !$value)<br>
     die("Incorrect option,Quit");<br>
<br>
    $this->select_option[$this->option_number]["label"] = $label;<br>
    $this->select_option[$this->option_number]["value"] = $value; <br>
<br>
    if(!$this->select_multiple)<br>
    {<br>
    if($this->select_value==""||$checkit)<br>
     {<br>
      $this->select_value=value;<br>
     $this->select_default["name"]=$this->select_name; <br>
     $this->select_default["value"]=$this->select_value;<br>
     }<br>
      } <br>
      else<br>
      { <br>
     if($checkit)<br>
      {<br>
     if($this->select_value=="")<br>
      $this->select_value=$value<br>
     else<br>
      $this->select_value.=";".$value;<br>
     $this->select_default["name"]=$this->select_name;<br>
     $this->select_default["value"]=$this->select_value;<br>
     }<br>
    }<br>
   $this->option_number++;<br>
    }<br>
<br>
   //获得变量默认值<br>
   function get_defaults()<br>
   {<br>
   return $this->select_default; <br>
   }<br>
   <br>
   //返回对象类型 <br>
   function My_Type()<br>
   {<br>
    return I_AM_SELECT;<br>
    }<br>
<br>
   function Make_Element($deck)<br>
   {<br>
   if($select_multiple)<br>
   printf("<selesct name="%s" multiple="true">
", $this->select_name);<br>
    else<br>
   printf("<select name="%s">
", $this->select_name);<br>
<br>
   while (list($key, $value) = each($this->select_option))<br>
     { <br>
      printf("<option value="%s">%s
",<br>
           $value["value"], convert_character($value["label"]));<br>
     }<br>
<br>
    echo "
";<br>
   <br>
    }<br>
   }; <br>
9.Do对象声明 <br>
class My_Do <br>
   {<br>
   //属性声明<br>
   var $do_name;<br>
   var $do_label;<br>
   var $do_var;<br>
   var $do_url;<br>
<br>
   //方法声明<br>
<br>
   //自构函数<br>
<br>
   function My_Do($name="",$label,$var,$url)<br>
   { <br>
    $this->do_name = $name;<br>
    $this->do_label = $label; <br>
    $this->do_var = $var;<br>
    $this->do_url = $url;<br>
   } <br>
   <br>
   //设置do_var<br>
   function set_var($var)<br>
   {<br>
   $this->do_var=$var;<br>
    }<br>
<br>
   //设置do_url<br>
   function set_url($url) <br>
   {<br>
    $this->do_url=$url;<br>
   }<br>
    //返回名称<br>
   function get_name()<br>
   {<br>
     return $this->do_name;<br>
   }<br>
<br>
   //返回标签<br>
   function get_label()<br>
   {<br>
    return $this->do_label;<br>
   }<br>
<br>
   //返回对象类型<br>
   function My_Type()<br>
   {<br>
    return I_AM_DO;<br>
    }<br>
<br>
   //产生Do部分的代码<br>
   function Make_Element($deck)<br>
   {<br>
   while (list($key, $value) = each($this->do_var))<br>
    $the_var.= $value."=$(".$value.")&";<br>
   <br>
   if ($this->do_name != "")<br>
    $the_var.=$this->do_name."=".$this->do_label;<br>
<br>
   if (substr($the_var, -5) == "&")<br>
     $the_var = substr($the_var, 0, strlen($the_var)-5);<br>
   printf("
", $this->do_label);<br>
   printf("
", $this->do_url, $the_var);<br>
<br>
   echo "
";<br>
   echo "
";<br>
   }<br>
  }; <br>
10.Fieldset对象声明 <br>
  class My_Fieldset<br>
  { <br>
   //属性声明<br>
   var $fieldset_title; <br>
   var $fieldset_element;<br>
   var $element_number;<br>
<br>
  //方法说明<br>
<br>
  //自构函数<br>
  function My_Fieldset($title) <br>
  {<br>
   $this->fieldset_title = $title;<br>
   $this->element_number = 0;<br>
  }<br>
<br>
   //添加元素<br>
  function Add_Element($element)<br>
  {<br>
   if (!is_object($element))<br>
   die("Unlegal Element,Quit"); <br>
<br>
   switch($element->My_Type())<br>
   {<br>
<br>
    case I_AM_TEXT:<br>
    case I_AM_IMAGE:<br>
    case I_AM_TABLE: <br>
    case I_AM_HYPERLINK: <br>
    case I_AM_INPUT: <br>
    case I_AM_SELECT: <br>
   case I_AM_DO:<br>
    {<br>
     $this->fieldset_element[$this->element_number] = $element;<br>
<br>
    $this->element_number++;<br>
<br>
    break;<br>
   }<br>
    default: <br>
   { <br>
   die("Unlegal Element,Quit");<br>
   } <br>
  }<br>
 }<br>
   <br>
   //获取变量默认值 <br>
   function get_defaults() <br>
   {<br>
    $i = 0;<br>
    while (list($key, $value) = each($this->fieldset_element)) <br>
    {<br>
     switch ($value->My_Type())<br>
     {<br>
     case I_AM_SELECT:<br>
      {<br>
      if($value->get_defaults())<br>
     {<br>
     $temp_default=$value->get_defaults();<br>
     $fieldset_default[$i]=$temp_default;<br>
     $i++; <br>
     }<br>
     } <br>
    break;<br>
     }<br>
    default:<br>
    {<br>
    break;<br>
    }<br>
   }<br>
   }<br>
  return fieldset_default;<br>
  }<br>
 <br>
  //返回对象类型<br>
  function My_Type() <br>
  {<br>
   return I_AM_FIELDSET;<br>
  }<br>
<br>
  //创建Fieldset部分代码<br>
  function Make_Element($deck)<br>
  {<br>
   printf("<fieldset title="%s">
",$fieldset_title);<br>
<br>
   for($i=0;$i<$this->element_number;$i++) <br>
   {<br>
    $temp_element = $this->fieldset_element[$i];<br>
    switch ($temp_element->My_Type())<br>
    {<br>
     case I_AM_TEXT:<br>
     case I_AM_IMAGE:<br>
     case I_AM_TABLE:<br>
     case I_AM_HYPERLINK:<br>
     case I_AM_INPUT:<br>
     case I_AM_SELECT:<br>
     case I_AM_DO:<br>
     {<br>
      $temp_element->Make_Element(&$deck);<br>
      break;<br>
     }<br>
     default:<br>
     {<br>
      break;<br>
     }<br>
    }<br>
   }<br>
   printf("");<br>
  }<br>
 };<br>
 ?>    

PHP单例

<?php
/*
实现过程:
首先防止住外部随便的new操作
*/
 
class Single {
    protected static $ins = null;
    protected $hash;
     
    private function __construct() {
        $this->hash = rand(100000,999999);
    }
 
    public static function getInstance() {
         if(self::$ins ==  null) {
            self::$ins = new self();
         }
 
         return self::$ins;
    }
 
    private function __clone() {
    }
}
 
 
$s1 = Single::getInstance();
$s2 = Single::getInstance();
?>

PHP.ini配置文件中文

;;;;;;;;;;;
; 警告 ;
;;;;;;;;;;;
; 此配置文件是对于新安装的PHP的默认设置.
; 默认情况下,PHP使用此配置文件安装
; 此配置针对开发目的,并且*不是*针对生产环境
; 基于一些安全方面的考虑,在你的网站上线之前,请考虑使用php.ini-recommended
; 以及在线文档 http://php.net/manual/en/security.php.


;;;;;;;;;;;;;;;;;;;
; 关于 php.ini   ;
;;;;;;;;;;;;;;;;;;;
; 此文件控制了PHP行为的很多方面.  为了让PHP能够读取它
; 必须命名为 "php.ini".  PHP 在其当前工作目录,由PHPRC环境变量指定目录
; 以及由编译时指定的目录(按此顺序)查找此文件
; 在Windows环境下, 编译时目录是Windows目录.
; 在命令行模式下查找php.ini的目录可以被-c参数覆盖.
;
; 此文件的语法非常简单.
; 空行和由分号开始的行会被忽略(你可能已经猜到了).
; 段的开头(例如 [Foo]) 同样会被悄悄忽略
; 即使在将来他们可能会有其他作用.
;
; 使用以下语法来设定指令:
; directive = value
; 指令 = 值
; 指令名称是 *大小写敏感* - foo=bar 和 FOO=bar 是不同的.
;
; 值可以是字符串,数值,PHP常量 (例如 E_ALL 和 M_PI), 
; INI 常量 (On, Off, True, False, Yes, No 和 None) 或者一个表达式
; (例如 E_ALL & ~E_NOTICE), 或者带引号的字串 ("foo").
;
; 在INI文件中的表达式只能使用逻辑运算和圆括号:
; |        逻辑或
; &       逻辑与
; ~       逻辑非
; !        取反
;
; 逻辑标志可以使用1,On,True或者Yes来打开.
; 也可以使用0, Off, False 或者 No来关闭.
;
; 在等号后面不写任何内容代表了一个空字符串
; 或者使用 None 关键词:
;
;  foo =         ; 将foo设置成一个空字串
;  foo = none    ; 将foo设置成一个空字串
;  foo = "none"  ; 将foo设置成字串 "none"
;
; 如果你在值中使用了常量, 并且这个常量属于一个动态加载的扩展模块
; (不论是PHP扩展还是Zend扩展),
; 那你只能在加载这些扩展 *之后* 使用这些常量.
;
;
;;;;;;;;;;;;;;;;;;;
; 关于这个文件  ;
;;;;;;;;;;;;;;;;;;;
; 在php.ini-dist 文件中所有的值都相当于内建的默认值
; (就是如果没有使用php.ini, 或者如果你删除了这些行,
; 就和内建的默认值一样).


;;;;;;;;;;;;;;;;;;;;
; 语言选项 ;
;;;;;;;;;;;;;;;;;;;;

; 打开在Apache下的PHP脚本语言引擎
engine = On

; 打开Zend Engine兼容模式(PHP 4.x)
zend.ze1_compatibility_mode = Off

; 允许 <? 标签.  否则,只有 <?php 和 <script> 标签被认为是PHP脚本.
; 注意: 尽可能避免在开发可重新发布的程序或者库的时候使用简略标签,或者在不受你控制的服务器下发布,
; 因为简略标签可能不被目标服务器支持.为了可移植性, 可重新发布的代码, 请不要使用简略标签
short_open_tag = On

; 使用ASP风格 <% %> 标签.
asp_tags = Off

; 浮点数中数值的有效位数(浮点数精度).
precision    =  12

; 强制2000年兼容 (可能引起不兼容浏览器的问题)
y2k_compliance = On

; 输出缓冲允许在你发送了body内容之后发送header(包括 cookies) 
; 代价是稍稍减缓了PHP输出层
; 你可以在运行时调用 output buffering 函数来打开此功能
; 你也可以将此指令设置为On来对所有文件打开输出缓冲
; 如果你想将这个缓冲区限制到特定大小 - 你可以使用最大的字节数来代替"On",来作为这个指令的参数 (例如 output_buffering=4096).
output_buffering = Off

; 你可以将所有你脚本输出的内容重定向到指定函数.  
; 例如, 如果你设置 output_handler 到 "mb_output_handler", 
; 字符编码会被转换成为指定的编码..
; 设置任何的输出处理句柄会自动打开输出缓冲.
; 注意: 如果想编写可移植脚本就不要依赖此INI配置
;       取而代之的是, 明确的使用 ob_start() 来设置输出处理句柄.
;       使用此ini指令可能引起问题,除非你很清楚的理解脚本正在做什么.
; 注意: 你不能同时使用 "mb_output_handler" 和 "ob_iconv_handler"
;       并且你不能同时使用 "ob_gzhandler" 和 "zlib.output_compression".
; 注意: 如果使用zlib.output_handler指令开启zlib输出压缩, 该指令必须为空.
;output_handler =

; 使用zlib库对输出进行压缩
; 对此选项的有效值是 "off", "on", 或者字节数 (用来压缩的缓冲大小 , 默认是 4KB)
; 注意: 结果的chunk大小可能由于压缩对象的大小而不同.
;       PHP输出块的大小一般压缩之后每个大小时几百个字节.
;       如果你希望藉由一个大块的堆大小来获取更好的性能, 需要额外的打开 output_buffering 选项.
; 注意: 你必须使用 zlib.output_handler 来替代标准的
;       output_handler, 否则输出可能会有问题.
zlib.output_compression = Off
;zlib.output_compression_level = -1

; 这里激活 zlib.output_compression 之后,你无法再指定额外的输出处理.
; 这个设置和 output_handler 一样,但是处理顺序不同.
;zlib.output_handler =

; 立即刷新告知 PHP 让输出层在每次输出块之后立刻自动刷新.
; 这和每次调用print()或者echo()函数以及任何一种HTML块后调用flush()一样. 
; 打开此选项会严重导致性能下降,一般只有用于调试情况下才建议打开.
implicit_flush = Off

; 如果反序列器找到一个可以作为示例的未定义类.未序列化的回调函数会被调用(使用未定义的类名作为参数), 
; 如果特定的函数未被定义或者如果此函数没有包含/实现丢失的类,则会发生一个警告. 
; 如果只有你真想要实现类似的回调函数,才设定此入口.
unserialize_callback_func=

; 当浮点和双精度被序列化后,浮点号后由 serialize_precision 指定存储精确度的有效位数. 
; 默认值是当浮点数被反序列解码后,数值仍旧相同.
serialize_precision = 100

; 是否打开强制通过引用传递参数给函数
; 此方法被反对并且很有可能在未来版本的PHP/Zend中不再被支持.
; 被孤立的指定的方法是参数应该在函数被声明的时候按照引用传入.
; 你被鼓励来尝试上述方法并关闭此选项来确保你脚本在今后的新版本中仍旧可以正常工作 ( 每次你使用此特性的时候会受到一个警告
; 并且参数会传值而不是传引用).
allow_call_time_pass_reference = On

;
; 安全模式
;
safe_mode = Off

; 默认情况下,安全模式在打开文件时,使用UID来比对检测.
; 如果你只想使用GID做宽松的比对,
; 打开 safe_mode_gid.
safe_mode_gid = Off

; 当 safe_mode 被打开, 此目录下包含的文件和子文件夹的UID/GID 检测会被绕过.
; (目录必须在 include_path 中存在或者必须在包含时使用全路径)
safe_mode_include_dir =

; 当 safe_mode 被打开, 只有在 safe_mode_exec_dir 中定义的可执行文件能够通过exec函数组打开执行.
safe_mode_exec_dir =

; 设定某些的环境变量可能成为潜在的安全隐患.
; 此指令包含一个逗号分隔的前导列表. 
; 在安全模式中, 用户可能只能改变符合这里所给出前导字符的变量. 
; 默认情况下,用户只能改变以PHP_开头的变量(例如. PHP_FOO=BAR).
;
; 注意:  如果此指令为空, PHP会允许用户修改任何环境变量!
safe_mode_allowed_env_vars = PHP_

; 此指令包含了一个用逗号分隔的环境变量列表, 用户无法通过 putenv() 函数来修改列表中的环境变量.
; 这些变量即便已经在 safe_mode_allowed_env_vars 所设定的列表中,也会被被保护不允许修改.
safe_mode_protected_env_vars = LD_LIBRARY_PATH

; 如果设置了open_basedir, 将会限制文件操作只能是此指令下的目录和子目录. 
; 此指令对于每目录或者每虚拟主机配置文件最有意义. 此指令* 不会 *受安全模式开或者关的影响.
;open_basedir =

; 此指令允许你为了安全原因关闭指定的函数.
; 它接受以逗号分隔的函数名的列表.
; 此指令* 不会 *受安全模式开或者关的影响.
disable_functions =

; 此指令允许你由于安全原因关闭指定的类.
; 它接受以逗号分隔的类名的列表.
; 此指令* 不会 *受安全模式开或者关的影响.
disable_classes =

; 语法高亮模式的色彩. 任何在 <span style="color: ???????"> 中可接受的值都可以使用.
;highlight.string  = #DD0000
;highlight.comment = #FF9900
;highlight.keyword = #007700
;highlight.bg      = #FFFFFF
;highlight.default = #0000BB
;highlight.html    = #000000

; 如果打开, 即便用户放弃了的请求也会被执行完成. 
; 在执行可能被用户打断或者浏览器超时所中断的请求时打开此选项.
; ignore_user_abort = On

; 指定PHP使用的实际路径的缓冲. 对于PHP打开很多文件来处理很多文件操作的系统上,应该增加此值.
; realpath_cache_size=16k

; 对于给定文件或者目录的缓冲真实路径信息的缓冲保留秒数. 对于很少修改文件的系统可以考虑增加此值.
; realpath_cache_ttl=120

;
; 其他
;
; 考虑到PHP可能被其所安装的服务器上暴露的事实(例如. 被web服务器作为头部信息的签名). 
; 任何情况下这虽然不是安全威胁, 仍有可能暴露在你的服务器上是否正在使用PHP.
expose_php = On


;;;;;;;;;;;;;;;;;;;
; 资源限制 ;
;;;;;;;;;;;;;;;;;;;

; 每个脚本最大执行秒数
max_execution_time = 30
; 每个脚本用来分析请求数据的最大时间
max_input_time = 60
; 最大输入变量的嵌套级别
;max_input_nesting_level = 64
; 每个脚本能够使用的最大内存数量 (128MB)
memory_limit = 128M 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 错误处理和记录 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 错误报告时一个位. 对每一个数值取或可以得到最终的报告级别
; E_ALL             - 所有错误和警告 (不包含 E_STRICT)
; E_ERROR           - 致命的运行时错误
; E_RECOVERABLE_ERROR  - 几乎致命的运行时错误
; E_WARNING         - 运行时警告 (非致命错误)
; E_PARSE           - 编译时语法错误
; E_NOTICE          - 运行时提醒 (这些警告常常由你代码中的bug导致, 但是也有可能是有意的行为 (例如, 使用一个未初始化的变量并依赖于其会被自动初始化成为一个空字符串的事实)
; E_STRICT          - 运行时提醒, 打开后PHP会给出针对你代码的最易移植和最好向后兼容性的建议
; E_CORE_ERROR      - PHP初始化启动时的致命错误
; E_CORE_WARNING    - 在PHP初始化时发生的警告 (非致命错误) 
; E_COMPILE_ERROR   - 致命的编译时错误
; E_COMPILE_WARNING - 编译时警告 (非致命)
; E_USER_ERROR      - 用户产生的错误信息
; E_USER_WARNING    - 用户产生的警告信息
; E_USER_NOTICE     - 用户产生的提示信息
;
;例子:
;
;   - 显示所有错误, 除了提示以及代码标准警告以外
;
;error_reporting = E_ALL & ~E_NOTICE
;
;   - 显示所有错误,除了提示以外
;
;error_reporting = E_ALL & ~E_NOTICE | E_STRICT
;
;   - 只显示错误
;
;error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR
;
;   - 显示出了提示以及代码标准警告之外的错误
;
error_reporting  =  E_ALL & ~E_NOTICE

; 打印输出错误 (作为输出的一部分).  对于生产环境的网站来说,
; 强烈建议你关闭此选项, 使用错误日志来替代 (详情参考下面内容).  
; 在一个生产环境下的web站点打开display_errors可能泄漏安全信息给最终用户, 例如web服务器的文件路径,你数据库的结构或者其他信息.
;
; display_errors可用的值:
;
; Off        - 不显示任何错误信息
; stderr     - 将错误信息输出到STDERR (只有 CGI/CLI 格式下有效!)
;
;display_errors = "stderr"
;
; stdout (On) - 输出错误信息到STDOUT上
;
display_errors = On

; 即使 display_errors 打开后,PHP启动序列中发生的错误也不会显示.
; 强烈建议你保持 display_startup_errors 关闭状态, 除非在排错
display_startup_errors = Off

; 将错误输入到日志文件 (服务器指定的log,stderr或者error_log (以下指定))
; 和上面提到的一样, 强烈建议你在生产环境的web站点下使用错误日志来代替错误显示.
log_errors = Off

; 设定log_errors的最大长度. 在 error_log 关于源的信息也计算在内.
; 默认是1024, 设置为0可以不限制任何最大长度.
log_errors_max_len = 1024

; 不要记录重复的信息.必须出现在同样文件的相同行之中的才被认为是重复信息,除非 ignore_repeated_source 被设为 true.
ignore_repeated_errors = Off

; 当忽略重复消息时忽略消息的来源. 当此设置打开后,不再记录来自不同文件或者不同行的相同消息.
ignore_repeated_source = Off

; 如果此选项被设置为 Off, 那么内存泄漏不会被显示 (不论在stdout还是在日志中). 
; 此项仅在debug编译模式下有效, 并且错误报告需要包含 E_WARNING
report_memleaks = On

;report_zend_debug = 0

; 在$php_errormsg中保存最后一次错误/警告消息 (逻辑值).
track_errors = Off

; 关闭在错误信息中所包含的HTML标签.
; 注意: 永远不要再生产环境中使用此特性.
;html_errors = Off

; 如果html_errors 设置为On, 则PHP产生可点击的错误信息,点击后会跳转到描述此错误或者引起此错误的函数具体信息的页面.
; 你可以从 http://www.php.net/docs.php 下载一份PHP手册的副本
; 并且将 docref_root指向你放置本地拷贝的以"/"开头的.
; 你同时必须指定文件文件的包含点的扩展名.
; 注意: 永远不要再生产环境中使用此特性.
;docref_root = "/phpmanual/"
;docref_ext = .html

; 在输出的错误信息前加上的字符串.
;error_prepend_string = "<font color=#ff0000>"

; 在输出的错误信息之后加上的字符串.
;error_append_string = "</font>"

; 将错误记录到指定文件.
;error_log = filename

; 将错误记录到 syslog (NT系统上的Event Log在Windows 95下不可用).
;error_log = syslog


;;;;;;;;;;;;;;;;;
; 文件处理 ;
;;;;;;;;;;;;;;;;;
;
; 注意 - track_vars 在PHP 4.0.3 中总是打开的

; 在PHP产生的URL中用来分隔参数的符号.
; 默认是 "&".
;arg_separator.output = "&amp;"

; PHP用来将URL分割输入到变量中的分隔符.
; 默认是 "&".
; 注意: 所有包含在指令内的字符都会被认为是分隔符!
;arg_separator.input = ";&"

; 此指令描述了PHP注册GET, POST, Cookie, 环境 和 内置变量的顺序  (各自使用G, P, C, E 和 S , 一般使用 EGPCS 或 GPC).  注册使用从左往右的顺序, 新的值会覆盖旧的值.
variables_order = "EGPCS"

; 是否将EGPCS变量注册成为全局变量.
; 如果你不希望由于用户数据而导致你脚本的全局变量变得凌乱,你需要关闭此选项
; 这个一般随着 track_vars 打开 - 在这种情况下你能够通过$HTTP_*_VARS[]存取所有的GPC变量.
;
; 你应该努力写好脚本这样就不必打开register_globals 
; 如果代码不是经过详细的斟酌,那将变量作为全局使用可能很容易导致潜在的安全漏洞.
register_globals = Off

; 是否注册老形式的输入数组, HTTP_GET_VARS 和相关数组
; 如果你不使用他们,建议为了提高性能关闭他们.
register_long_arrays = On

; 此指令让PHP确认是否申明 argv&argc 变量 (这些变量会包含GET信息). 
; 如果你不使用这些变量,为了提升性能应该关闭此选项.
register_argc_argv = On

; 当打开此项, SERVER 和 ENV 变量将在第一次被使用时而不是脚本一开始时创建(运行时)
; 如果这些变量在脚本中没有被使用过, 打开此项会增加一点性能.
; 为了使此指令有效,PHP指令 register_globals, register_long_arrays,
; 以及 register_argc_argv 必须被关闭.
auto_globals_jit = On

; PHP可以接受的最大的POST数据大小.
post_max_size = 8M

; Magic quotes
;

; 针对GET/POST/Cookie数据打开Magic quotes.
magic_quotes_gpc = On

; 针对实时产生的数据打开Magic quotes, 例如从SQL获取的数据, 从exec()返回的数据等等.
magic_quotes_runtime = Off

; 使用 Sybase 风格的 magic quotes (使用"来引导"替代").
magic_quotes_sybase = Off

; 在任何PHP文档之前或之后自动增加文件.
auto_prepend_file =
auto_append_file =

; 和 4.0b4一样, PHP 总是使用默认在头 Content-type: 的编码输出字符. 
; 将其设置为空可以禁用发送字符集.
;
; PHP内建默认为text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"

; 总是填充 $HTTP_RAW_POST_DATA 变量.
;always_populate_raw_post_data = On


;;;;;;;;;;;;;;;;;;;;;;;;;
; 路径和目录 ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "path1;path2"
;include_path = ".;c:phpincludes"

; PHP页面的根路径, 只有非空时有效.
; 如果PHP没有使用FORCE_REDIRECT来编译, 如果你将php作为CGI运行在任何web服务器下(除了IIS)的话,你必须设置doc_root
; 针对安全问题查看文档.  一种替代方案是使用下面的cgi.force_redirect
doc_root =

; PHP使用/~username打开脚本的目录,非空时才有效.
user_dir =

; 可加载的扩展(模块)的目录位置.
extension_dir = "./"

; 是否启用 dl() 函数.  dl() 函数无法正常的在多线程服务下运行, 例如IIS或者Zeus, 并在在这些服务软件下会自动禁用.
enable_dl = On

; 在绝大多数web服务器下,cgi.force_redirect 对于提供安全执行PHP作为CGI来说是很有必要的. 
; 没有配置的情况下,PHP会默认打开此项.
; 你可以在这里关闭此项并且自己承担风险
; **你可以在IIS安全的关闭此项,事实上,你必须关闭此项.**
; cgi.force_redirect = 1

; 如果 cgi.nph 被打开,就会强制CGI在每个请求时发送Status: 200.
; cgi.nph = 1

; 如果cgi.force_redirect被打开,并且你没有在Apache或者Netscape(iPlanet) web服务器下运行, 
; 你也许需要设置一个环境变量名让PHP来查找让其可以获取后继续执行. 设置此变量可能引起安全问题, 在设置之前请先了解可能引起的后果.
; cgi.redirect_status_env = ;

; cgi.fix_pathinfo 为CGI提供 *真实* PATH_INFO/PATH_TRANSLATED 支持.  
; PHP的预处理行为是设置 PATH_TRANSLATED 到 SCRIPT_FILENAME, 并且不去猜测 PATH_INFO 是什么. 
; 想获取关于 PATH_INFO 更多的信息, 查看 cgi 规范.  
; 将此值设置为1会引起PHP CGI修正它的路径来符合规范.
; 设置为0会引起PHP类似前面的行为. 默认是1. 你应该修正你的脚本来使用 SCRIPT_FILENAME 而不是 PATH_TRANSLATED.
; cgi.fix_pathinfo=0

; 在IIS下的FastCGI (在基于 WINNT 的操作系统下) 支持莫让呼叫客户端的安全令牌的能力.
; 这使得IIS能够定义其下运行的安全上下文.
; 在Apache下的mod_fastcgi 目前不支持此特性 (03/17/2002)
; 如果运行在IIS下设置为1. 默认是0.
; fastcgi.impersonate = 1;

; 关闭通过 FastCGI 连接的日志
; fastcgi.logging = 0

; cgi.rfc2616_headers 配置选项告知 PHP 当发送HTTP响应代码时使用什么类型的头
; 如果设置为0,PHP发送被Apache支持的 Status: 头信息.
; 当设置为1, PHP会发送 RFC2616 兼容的头信息.
; 默认为0.
; cgi.rfc2616_headers = 0


;;;;;;;;;;;;;;;;
; 文件上传 ;
;;;;;;;;;;;;;;;;

; 是否允许HTTP文件上传.
file_uploads = On

; 对于HTTP上传文件的临时文件目录 (如果没有指定则会使用系统默认).
;upload_tmp_dir =

; 允许上传的最大文件大小.
upload_max_filesize = 2M


;;;;;;;;;;;;;;;;;;
; Fopen 包装 ;
;;;;;;;;;;;;;;;;;;

; 是否允许将URL作为文件 (例如 http:// 或者 ftp://) .
allow_url_fopen = On

; 是否允许 include/require 将URL作为文件 (例如 http:// 或者 ftp://) .
allow_url_include = Off

; 定义匿名ftp密码 (你的电子邮件地址)
;from="john@doe.com"

; 定义 User-Agent 字符串
; user_agent="PHP"

; 定义基于流的socket接口的超时时间 (秒)
default_socket_timeout = 60

; 如果你的脚本必须处理从 Macintosh 系统来的文件,
; 或者你运行在一台Mac并且需要从unix或者win32系统上处理文件,
; 设置此标志会引起PHP自动检测这些文件的EOL字符,这样fgets() 和 file() 就可以不用管文件的来源而直接处理了.
; auto_detect_line_endings = Off


;;;;;;;;;;;;;;;;;;;;;;
; 动态扩展 ;
;;;;;;;;;;;;;;;;;;;;;;
;
; 如果你希望扩展自动加载, 使用下列语法:
;
;   extension=modulename.extension
;
; 例如,在Windows系统上:
;
;   extension=msql.dll
;
; ... 或者在 UNIX 下:
;
;   extension=msql.so
;
; 注意: 这里应该只是模块的名字; 
; 这里不需要模块的目录信息.
; 使用上面的 extension_dir 指令来指定扩展的位置.


; Windows Extensions
; 注意:已经内建了ODBC支持,所以不需要针对ODBC的dll.
; 注意:许多DLL文件位于 extensions/ (PHP 4) 或者 ext/ (PHP 5)目录中,和分割的PECL DLL下载在一起 (PHP 5).
; 确定设置了正确的 extension_dir 指令.

;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_ifx.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_mcrypt.dll
;extension=php_mhash.dll
;extension=php_mime_magic.dll
;extension=php_ming.dll
;extension=php_msql.dll
;extension=php_mssql.dll
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_oci8.dll
;extension=php_openssl.dll
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_pspell.dll
;extension=php_shmop.dll
;extension=php_snmp.dll
;extension=php_soap.dll
;extension=php_sockets.dll
;extension=php_sqlite.dll
;extension=php_sybase_ct.dll
;extension=php_tidy.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
;extension=php_zip.dll

;;;;;;;;;;;;;;;;;;;
; 模块设置 ;
;;;;;;;;;;;;;;;;;;;

[Date]
; 定义date函数使用的默认时区
;date.timezone =

;date.default_latitude = 31.7667
;date.default_longitude = 35.2333

;date.sunrise_zenith = 90.583333
;date.sunset_zenith = 90.583333

[filter]
;filter.default = unsafe_raw
;filter.default_flags =

[iconv]
;iconv.input_encoding = ISO-8859-1
;iconv.internal_encoding = ISO-8859-1
;iconv.output_encoding = ISO-8859-1

[sqlite]
;sqlite.assoc_case = 0

[xmlrpc]
;xmlrpc_error_number = 0
;xmlrpc_errors = 0

[Pcre]
;PCRE 库反响追踪限制.
;pcre.backtrack_limit=100000

;PCRE 库递归限制. 
;请注意如果你设置此项到一个很高的值, 你可能耗尽所有的可用的进程堆并且最终弄宕PHP(由于到达了操作系统强制的堆大小的限制).
;pcre.recursion_limit=100000

[Syslog]
; 是否定义不同的syslog变量 (例如. $LOG_PID,
; $LOG_CRON, 等等.).  关闭此选项对性能有益. 
; 在运行时, 你可以调用 define_syslog_variables() 函数来定义这些变量.
define_syslog_variables  = Off

[mail function]
; 针对Win32.
SMTP = localhost
smtp_port = 25

; 针对Win32.
;sendmail_from = me@example.com

; 针对Unix.  可以支持参数 (默认: "sendmail -t -i").
;sendmail_path =

; 强制额外的指定的参数被作为扩展参数传送给sendmail执行文件.
; 这些参数总是替代mail()函数的第五个参数值, 甚至是在安全模式内.
;mail.force_extra_parameters =

[SQL]
sql.safe_mode = Off

[ODBC]
;odbc.default_db    =  目前无效
;odbc.default_user  =  目前无效
;odbc.default_pw    =  目前无效

; 允许或阻止持久连接.
odbc.allow_persistent = On

; 在重用前检查连接是否可用.
odbc.check_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
odbc.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
odbc.max_links = -1

; 长字段处理.  返回变量的字节数.  0 意味着略过.
odbc.defaultlrl = 4096

; 二进制数据处理. 0 意味着略过, 1按照实际返回, 2 转换到字符.
; 查看 odbc_binmode 和 odbc_longreadlen 的文档来获取针对 uodbc.defaultlrl 和 uodbc.defaultbinmode的解释
odbc.defaultbinmode = 1

[MySQL]
; 允许或阻止持久连接.
mysql.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
mysql.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
mysql.max_links = -1

; mysql_connect()默认的端口号.  如果没有设置, mysql_connect() 会使用 $MYSQL_TCP_PORT 
; 或者 位于/etc/services的 mysql-tcp 入口或者编译时定义的MYSQL_PORT 值(按照此顺序查找). 
; Win32 只会查找MYSQL_PORT值.
mysql.default_port =

; 对于本地MySQL连接的默认socket名称. 如果为空, 则使用MySQL内建默认值.
mysql.default_socket =

; mysql_connect() 的默认host值(在安全模式中不会生效).
mysql.default_host =

; mysql_connect() 的默认user值(在安全模式中不会生效).
mysql.default_user =

; mysql_connect() 的默认password值(在安全模式中不会生效).
; 注意在此文件中保存密码一般来说是 *糟糕* 的主义.
; *任何* 使用PHP的用户可以执行 "echo get_cfg_var("mysql.default_password")
; 并且获取到此密码! 而且理所当然, 任何有对此文件读权限的用户都可以获取到此密码.
mysql.default_password =

; 连接超时的最大时间 (秒) , -1 意味着没有限制.
mysql.connect_timeout = 60

; 追踪模式. 当 trace_mode 被打开 (=On), table/index 扫描的警告和SQL错误会被显示出来.
mysql.trace_mode = Off

[MySQLi]

; 最大连接数.  -1 意味着没有限制.
mysqli.max_links = -1

; mysqli_connect()默认的端口号.  如果没有设置, mysql_connect() 会使用 $MYSQL_TCP_PORT 
; 或者 位于/etc/services的 mysql-tcp 入口或者编译时定义的MYSQL_PORT 值(按照此顺序查找). 
; Win32 只会查找MYSQL_PORT值.
mysqli.default_port = 3306

; 对于本地MySQL连接的默认socket名称. 如果为空, 则使用MySQL内建默认值.
mysqli.default_socket =

; mysqli_connect() 的默认host值(在安全模式中不会生效).
mysqli.default_host =

; mysqli_connect() 的默认user值(在安全模式中不会生效).
mysqli.default_user =

; mysqli_connect() 的默认password值(在安全模式中不会生效).
; 注意在此文件中保存密码一般来说是 *糟糕* 的主义.
; *任何* 使用PHP的用户可以执行 "echo get_cfg_var("mysqli.default_password")
; 并且获取到此密码! 而且理所当然, 任何有对此文件读权限的用户都可以获取到此密码.
mysqli.default_pw =

; 允许或阻止持久连接.
mysqli.reconnect = Off

[mSQL]
; 允许或阻止持久连接.
msql.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
msql.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
msql.max_links = -1

[OCI8]
; 打开使用外部认证的授权连接 (OCI_SYSOPER, OCI_SYSDBA)
;oci8.privileged_connect = Off

; 连接: 每个进程的持久OCI8连接的最大数, -1 意味着没有限制.
;oci8.max_persistent = -1

; 连接: 一个进程允许保持一个空闲持久连接的最大秒数.
; -1意味着空闲持久连接会永远被保持.
;oci8.persistent_timeout = -1

; 连接: 当oci_pconnect() 检测一个连接是否有效时每次发起ping之间必须通过的秒数. 
; 当设置为0后, 每个oci_pconnect() 会发起一个ping. Using -1 完全关闭ping.
;oci8.ping_interval = 60

; 调优: 此选项打开声明缓冲(statement cache), 并且指定缓冲多少声明. 使用0关闭声明缓冲.
;oci8.statement_cache_size = 20

; 调优: 打开声明预取(statement prefetch) 并且设置自动在声明执行后被取到行的数量.
;oci8.default_prefetch = 10

; 兼容性: 设置为On 意味着 oci_close() 不会关闭 oci_connect() 和 oci_new_connect() 的连接.
;oci8.old_oci_close_semantics = Off

[PostgresSQL]
; 允许或阻止持久连接.
pgsql.allow_persistent = On

; 总是在 pg_pconnect() 时检测断开的持久连接.
; 自动重置特性会引起一点开销.
pgsql.auto_reset_persistent = Off

; 持久连接的最大数目.  -1 意味着没有限制.
pgsql.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
pgsql.max_links = -1

; 是否忽略 PostgreSQL 后端通告消息.
; 通告消息记录会需要一点开销.
pgsql.ignore_notice = 0

; 是否记录 PostgreSQL 后端通告消息.
; 除非 pgsql.ignore_notice=0, 否则模块无法记录通告消息
pgsql.log_notice = 0

[Sybase]
; 允许或阻止持久连接.
sybase.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
sybase.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
sybase.max_links = -1

;sybase.interface_file = "/usr/sybase/interfaces"

; 显示出的消息最小严重程度.
sybase.min_error_severity = 10

; 显示出的消息最小严重程度.
sybase.min_message_severity = 10

; 兼容老版本PHP 3.0的模式.
; 如果设为 on, 会引起 PHP 自动绑定结果记录的类型到Sybase的类型,而不是将他们全部按照字符串处理. 
; 此兼容模式可能不会永久存在, 所以最好尝试在你代码中需要的地方作出必要的修改, 然后关闭此选项.
sybase.compatability_mode = Off

[Sybase-CT]
; 允许或阻止持久连接.
sybct.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
sybct.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
sybct.max_links = -1

; 显示出的错误最小严重程度.
sybct.min_server_severity = 10

; 显示出的消息最小严重程度.
sybct.min_client_severity = 10

[bcmath]
; 所有bcmath函数的小数位数
bcmath.scale = 0

[browscap]
;browscap = extra/browscap.ini

[Informix]
; 对于 ifx_connect() 的默认host (不会在安全模式被应用).
ifx.default_host =

; 对于 ifx_connect() 的默认user (不会在安全模式被应用).
ifx.default_user =

; 对于 ifx_connect() 的默认password (不会在安全模式被应用).
ifx.default_password =

; 允许或阻止持久连接.
ifx.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
ifx.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
ifx.max_links = -1

; 如果设为 on, select 声明返回 text 段的内容而不是它的id.
ifx.textasvarchar = 0

; 如果设为 on, select 声明返回 byte 段的内容而不是它的id.
ifx.byteasvarchar = 0

; 固定长度字符列的尾部空格会被截去.  可能对 Informix SE 用户有帮助.
ifx.charasvarchar = 0

; 如果设为 on, text 和 byte 段会被dump到一个文件而不是在内存中保留它们.
ifx.blobinfile = 0

; NULL会被作为一个空字符串返回, 除非被设为1. 如果设为1, NULL会被作为字符串"NULL"返回.
ifx.nullformat = 0

[Session]
; 用来存储/获取数据的处理方法.
session.save_handler = files

; 传送到save_handler的参数.  在使用文件的情况下, 这里是数据文件被保存的路径.
; 注意: Windows 用户必须改变此值来使用PHP的会话函数.
;
; 和在 4.0.1一样, 你可以定义如下路径:
;
;     session.save_path = "N;/path"
;
; 这里的 N 是一个整数.  使用此参数会在目录内建立一个N层深度的子目录用来保存session文件,
; 而不是将所有session文件保存在同一个/path目录内.  
; 这对你或当你的操作系统在一个目录内保存太多文件时出现问题很有帮助.
; 并且对于处理大量session的服务器提供更高的效率.
;
; 注意 1: PHP不会自动创建目录结构. 你可以使用在ext/session目录内的脚本来创建目录结构.
; 注意 2: 如果你选择使用子目录来保存session,请检查下面关于垃圾回收的配置段
;
; 文件存储模块默认使用600模式来创建文件,在使用中你可以改变此选项
;
;     session.save_path = "N;MODE;/path"
;
; 这里的MODE由8进制来表示. 注意这里不会覆盖进程的umask.
;session.save_path = "/tmp"

; 是否使用cookie.
session.use_cookies = 1

;session.cookie_secure = 

; 这个选项允许管理员去保护那些在URL中传送session id的用户免于被攻击
; 默认是 0.
; session.use_only_cookies = 1

; session的名称 (作为cookie名称来使用).
session.name = PHPSESSID

; 在请求开始的时候初始化session.
session.auto_start = 0

; cookie的生存秒数,或者如果为0就直到浏览器重启.
session.cookie_lifetime = 0

; cookie有效的路径.
session.cookie_path = /

; cookie有效的域名.
session.cookie_domain =

; 是否将httpOnly标志增加到cookie上, 增加后则cookie无法被浏览器的脚本语言(例如JavaScript)存取.
session.cookie_httponly = 

; 用于序列化数据的处理器. php是标准的PHP序列化器.
session.serialize_handler = php

; 定义"垃圾回收"进程在每次session初始化时开始的比例.
; 比例由 gc_probability/gc_divisor来得出,
; 例如. 1/100 意味着在每次请求时有1%的机会启动"垃圾回收"进程.

session.gc_probability = 1
session.gc_divisor     = 100

; 在经过以下秒数之后, 存储的数据会被认为是"垃圾"并且被垃圾回收进程清理掉.
session.gc_maxlifetime = 1440

; 注意: 如果你使用子目录选项来保存session文件
;       (查看在上面的session.save_path), 那么垃圾回收就 *不会* 自动发生.
;       你需要通过一个shell脚本,cron或者其他方法来自行处理垃圾回收.
;       例如, 下面的脚本相当于将session.gc_maxlifetime设置为 1440 (1440 秒 = 24 分钟):
;          cd /path/to/sessions; find -cmin +24 | xargs rm

; PHP 4.2 和更早版本有一个未公开的 特性/bug , 此特性允许你在全局初始化一个session变量,即便 register_globals 已经被关闭.
; 如果此特性被使用,PHP 4.3 和更早版本会警告你.
; 你可以关闭此特性并且隔离此警告. 这时候,如果打开bug_compat_42,那此警告只是被显示出来.

session.bug_compat_42 = 1
session.bug_compat_warn = 1

; 检查HTTP Referer来防止带有id的外部URL.
; HTTP_REFERER 必须包含从session来的这个字段才会被认为是合法的.
session.referer_check =

; 从此文件读取多少字节.
session.entropy_length = 0

; 在这里指定创建session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; 设置为 {nocache,private,public,} 来决定HTTP缓冲的类型
; 留空则防止发送 anti-caching 头.
session.cache_limiter = nocache

; 文档在n分钟之后过期.
session.cache_expire = 180

; trans sid 支持默认关闭.
; 使用 trans sid 可能让你的用户承担安全风险.
; 使用此项必须小心.
; - 用户也许通过email/irc/其他途径发送包含有效的session ID的URL给其他人.
; - 包含有效session ID的URL可能被存放在容易被公共存取的电脑上.
; - 用户可能通过在浏览器历史记录或者收藏夹里面的包含相同的session ID的URL来访问你的站点.
session.use_trans_sid = 0

; 选择hash方法
; 0: MD5   (128 bits)
; 1: SHA-1 (160 bits)
session.hash_function = 0

; 当转换二进制hash数据到可读形式时,每个字符保存时有几位.
;
; 4 bits: 0-9, a-f
; 5 bits: 0-9, a-v
; 6 bits: 0-9, a-z, A-Z, "-", ","
session.hash_bits_per_character = 4

; URL rewriter会在已经定义的一组HTML标签内查找URL.
; form/fieldset 是特殊字符; 如果你在这里包含他们, rewriter会增加一个包含信息的隐藏<input>字段否则就是在URL中附加信息.
; 如果你你想遵守XHTML, 删除form的入口.
; 注意 所有合法的入口都需要一个"="符号, 甚至是没有任何值的.
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

[MSSQL]
; 允许或阻止持久连接.
mssql.allow_persistent = On

; 持久连接的最大数目.  -1 意味着没有限制.
mssql.max_persistent = -1

; 最大连接数 (持久 + 非持久).  -1 意味着没有限制.
mssql.max_links = -1

; 显示出的错误最小严重程度.
mssql.min_error_severity = 10

; 显示出的消息最小严重程度.
mssql.min_message_severity = 10

; PHP 3.0 老版本的兼容模式.
mssql.compatability_mode = Off

; 连接超时
;mssql.connect_timeout = 5

; 查询超时
;mssql.timeout = 60

; 有效范围 0 - 2147483647.  默认 = 4096.
;mssql.textlimit = 4096

; 有效范围 0 - 2147483647.  默认 = 4096.
;mssql.textsize = 4096

; 每批记录的数量限制.  0 = 所有记录在一批内.
;mssql.batchsize = 0

; 指定 datetime 和 datetim4 栏如何返回
; On => 返回数据转换到SQL服务器设置的格式
; Off => 使用 YYYY-MM-DD hh:mm:ss 返回
;mssql.datetimeconvert = On

; 当连接到服务器时使用NT验证
mssql.secure_connection = Off

; 指定最大进程数. -1 = 库默认
; msdlib 默认 25
; FreeTDS 默认 4096
;mssql.max_procs = -1

; 指定客户端字符集. 
; 如果为空或者没有指定,客户端字符集将会使用freetds.conf的配置
; 只有和FreeTDS编译时会被使用
;mssql.charset = "ISO-8859-1"

[Assertion]
; 断言(expr); 默认打开.
;assert.active = On

; 对于每个失败断言发起一个PHP警告.
;assert.warning = On

; 默认不要保释.
;assert.bail = Off

; 如果断言失败则调用用户自定义函数.
;assert.callback = 0

; 使用当前 error_reporting() Eval一个表达式.  如果你想要在eval()附近error_reporting(0) ,那设置为true.
;assert.quiet_eval = 0

[COM]
; 包含GUID,IID或者TypeLibs的文件的文件名的文件的路径
;com.typelib_file =
; 允许 Distributed-COM 调用
;com.allow_dcom = true
; 自动注册位于com_load()函数的组件typlib的常量
;com.autoregister_typelib = true
; 注册常量大小写敏感
;com.autoregister_casesensitive = false
; 当有重复常量注册时显示警告
;com.autoregister_verbose = true

[mbstring]
; 内部字符表示的语言.
;mbstring.language = Japanese

; 内部/脚本编码.
; 部分编码无法作为内部编码使用.
; (例如. SJIS, BIG5, ISO-2022-*)
;mbstring.internal_encoding = EUC-JP

; http 输入编码.
;mbstring.http_input = auto

; http 输出编码. mb_output_handler 必须作为函数被注册为输出缓冲
;mbstring.http_output = SJIS

; 按照mbstring.internal_encoding的设置打开自动编码转换
; 当设置为On时,输入字符被转换为内部编码.
; 注意: 不要针对可移植库/应用使用自动编码转换.
;mbstring.encoding_translation = Off

; 自动编码检测序列
; 自动意味着
;mbstring.detect_order = auto

; 当无法将字符从一种转换到另一种时使用的置换符号
;mbstring.substitute_character = none;

; 使用mbstring函数 覆盖(替换) 单字节函数.
; mail(), ereg(), 等等都会被 mb_send_mail(), mb_ereg() 等等覆盖,
; 可以取的值是 0,1,2,4 或者他们的组合.
; 例如, 7 就是覆盖所有函数.
; 0: 不覆盖
; 1: 覆盖 mail() 函数
; 2: 覆盖 str*() 函数
; 4: 覆盖 ereg*() 函数
;mbstring.func_overload = 0

[FrontBase]
;fbsql.allow_persistent = On
;fbsql.autocommit = On
;fbsql.show_timestamp_decimals = Off
;fbsql.default_database =
;fbsql.default_database_password =
;fbsql.default_host =
;fbsql.default_password =
;fbsql.default_user = "_SYSTEM"
;fbsql.generate_warnings = Off
;fbsql.max_connections = 128
;fbsql.max_links = 128
;fbsql.max_persistent = -1
;fbsql.max_results = 128

[gd]
; 告知jpeg解码器libjpeg警告并且尝试创建一个gd图像. 此警告会被作为一个通告显示
; 默认为关闭
;gd.jpeg_ignore_warning = 0

[exif]
; Exif UNICODE 用户注释会被作为UCS-2BE/UCS-2LE 和 JIS 来进行 JIS处理.
; 当 mbstring.internal_encoding 设置为空,如果有 mbstring 支持,则会自动转换到给出的对应编码设置的编码.
; 对于解码设置你可以在motorola和intel字符序列上进行选择. 解码设置不能设置为空.
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel    = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel    = JIS

[Tidy]
; 当调用tidy时,默认指向tidy配置文件的路径
;tidy.default_config = /usr/local/lib/php/default.tcfg

; tidy是否自动清除和修复输出?
; 警告: 不要在你产生非html内容时使用此项,例如产生动态图片时
tidy.clean_output = Off

[soap]
; 打开或关闭WSDL缓冲特性.
soap.wsdl_cache_enabled=1
; 设置SOAP扩展存放缓冲文件的目录.
soap.wsdl_cache_dir="/tmp"
; (存活时间) 设置当缓冲文件被用来替换原有缓冲文件的秒数.
soap.wsdl_cache_ttl=86400

; Local Variables:
; tab-width: 4
; End: