400-696-8028

PHP3中文文档

长沙北大青鸟作者:科泰校区佚名

摘要:  第1章 PHP3 入门 什么是PHP3? PHP3.0版本是一种服务器端HTML-嵌入式脚本描述语言。 PHP3能做什么? 也许PHP3最强大和最重要的特征是他的数据库集成层,使用它完成一个含有数
 


第1章  PHP3 入门

什么是PHP3?
    PHP3.0版本是一种服务器端HTML-嵌入式脚本描述语言。

PHP3能做什么?
    也许PHP3最强大和最重要的特征是他的数据库集成层,使用它完成一个含有数据库功能的网页是不可置信的简单。目前支持下面所列的数据库。

Oracle
Adabas D
Sybase
FilePro
MSQL
Velocis
MySQL
Informix
Solid
dBase
ODBC
Unix dbm
PostgreSQL
 

PHP的简要历史
    PHP从1994年秋天开始孕育,他的创始人是Rasmus Lerdorf。早期没有发布的版本是被他用在自己的网页上来跟踪有谁来参观过他的在线个人简历。被其他人使用的第一个版本是在1995年发布的,当时叫做Personal Home Page Tools。他包含了一个非常简单的语法分析引擎,只能理解一些指定的宏和一些Home Page后台的常见功能,如留言本,计数器和一些其他的素材。在1995年中期,重写了这个语法分析引擎并且命名为PHP/FI 2.0版本。FI来源于Rasmus所写的另一个可以接受Html表单数据的程序包。他组合了Personal Home Page Tools 脚本和Form Interpreter,并且加入了对mSQL的支持,于是PHP/FI 2.0诞生了。PHP/FI以惊人的速度发展,并且其他的人也开始对他的源码加以改进和修改。

    很难给出任何精确的统计数字,但是据估计到1996年末至少有15,000个WEB站点在使用PHP/FI 2.0,到了1997年中,这个数字已经成长为50,000个,1997年中PHP的发展也已经有了一些变化,他已经从Rasmus的宠物项目变成了更加有组织的团体项目。语法分析引擎也由Zeev Suraski 和 Andi Gutmans进行了重新改写,这个引擎构成了PHP3的基础。PHP/FI中的大部分通用代码都经过改写后引入了PHP3中。

    今天(1998年中),有许多商业的产品如C2's StrongHold web server和Red Hat Linux都开始支持PHP3或PHP/FI,根据由NetCraft提供的数字进行保守的推断,现在在世界各地大概有150,000个WEB站点在使用PHP或PHP/FI。从前景上看,在InterNet上这些站点远远比运行Netscape's flagship Enterprise server的要多。

使用PHP3进行HTTP认证
    只有在PHP以Apache的模块方式运行的时候才可以使用HTTP认证的功能。在Apache的模块PHP脚本中,可以使用Header()函数向客户断浏览器发送一个”Authentication Required”的消息,使浏览器弹出一个用户名/密码(username/password)的输入窗口,当用户输入用户名和密码后,包含PHP脚本的URL将会被再次调用,使用分别代表用户名,密码,和确认方式的$PHP_AUTH_USER, $PHP_AUTH_PW,$PHP_AUTH_TYPE变量。现在只有”BASIC”的确认方式被支持。

    在一个页面中强迫用户进行身份认证的代码段的例子如下:

 

    Example 2-1. HTTP 认证举例:

<?php

if(!isset($PHP_AUTH_USER)) {

Header("WWW-Authenticate: Basic realm="My Realm"");

Header("HTTP/1.0 401 Unauthorized");

echo "Text to send if user hits Cancel buttonn";

exit;

}

else {

echo "Hello $PHP_AUTH_USER.<P>";

echo "You entered $PHP_AUTH_PW as your password.<P>";

}

?>

    除了简单的输出$PHP_AUTH_USER 和 $PHP_AUTH_PW变量的值以外,你还可以检查用户名和密码的合法性,也许是对数据库进行查询,也许是在dbm文件中搜索用户。

    当心臭虫成堆的Internet Explorer浏览器,他对Hearders的顺序非常挑剔.所以采用在送出HTTP/1.0 401 header 请求之前送出WWW-Authenticate header请求是一个很好的解决方法。

    为了阻止一些人写一些脚本来显示一个经过传统外部机制验证过的页面的密码,采用如下方式:如果这一页面使用外部验证机制,将不会生成PHP_AUTH变量.这样,$REMOTE_USER变量可以被用来表示已经被外部机制验证的用户.

    注意,上面的方法并不能防止某些人在同一台服务器上利用无身份验证的URL偷取有身份鉴别的URL的密码。

    无论Netscape还是IE,在接到服务器的401回复之后,都将清空本地浏览器窗口的身份验证缓存。这种做法可以有效的使用户登录退出,从而强迫他们再次输入他们的用户名和密码。一些人使用这个方式来实现“超时”注册,或者提供登录退出的按钮。

    这种方法不是标准的HTTP基本身份鉴定所必须的,所以您可能从来都不依靠它。使用Lynx进行的测试并没有弄清楚401服务器回应的身份鉴定,所以如果使用“向前”或“向后”功能将打开源文件(只要信用需求还没有被改变)。

    虽然已经指出这种语言不能工作在Microsoft的IIS服务器上,但是PHP语言CGI版本将受到IIS的限制。

使用PHP建立GIF
    PHP并不仅仅可以用来建立HTML输出。它还可以用来制作GIF图形文件,甚至制作更简便的GIF图象流。要想这样做,您将需要使用GD函数库来编译PHP源文件。

 

    Example 2-2. 使用PHP来创建GIF文件

<?php

Header("Content-type: image/gif");

$string=implode($argv," ");

$im = imagecreatefromgif("images/button1.gif");

$orange = ImageColorAllocate($im, 220, 210, 60);

$px = (imagesx($im)-7.5*strlen($string))/2;

ImageString($im,3,$px,9,$string,$orange);

ImageGif($im);

ImageDestroy($im);

?>

    这个例子将被一个页面使用类似于:<img src="button.php3?text">的方法来调用。其中关于button.php3的脚本将把这一段文本覆盖在基本的图形上(在这里是“images/button1.gif”)然后输出结果图形。这是一个很简便的方法来防止每当用户希望改变按键的文本时候都重新画一次按钮图形。使用这种方法,他们将被动态的使用。

文件上载支持
    PHP有能力接受任何RFC-1867适应浏览器(包括Netscape Navigator 3.0或以后的版本, Microsoft Internet Explorer 3.0(使用了补丁程序)或以后的版本)的文件上载。这个特性让用户可以上载文本和二进制文件。使用PHP 的身份鉴定和文件处理函数,您可以完全控制谁可以上载文件和被上载的文件可以做些什么。

    可以采用类似下面的建立表单的方法来建立一个文件上载的屏幕。

 

Example 2-3.文件上载表单

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>

<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">

Send this file: <INPUT NAME="userfile" TYPE="file">

<INPUT TYPE="submit" VALUE="Send File">

</FORM>

    其中“_URL_”指向一个PHP的HTML文件。MAX_FILE_SIZE隐藏领域必须先于文件输入领域,它的值是可以接受的最大的文件大小。该值的单位是字节。在该目标文件中,下列变数用来定义是否成功的上载了文件:

$userfile:在将要存放上载文件的服务器上的临时文件名字。

$userfile_name:在发送者系统中的初始文件名。

$userfile_size:按字节计算的上载文件的大小。

$userfile_type:多用途网际邮件扩充协议类型的文件,如果浏览器提供这种信息。一个例子是“image/gif”。

    注释:在这里“userfile”部分是可以变化的,它可以取任何的名字只要在上载表单中类型仍然为“TYPE=file”即可。在上面的例子中,我们选择它的名字为“userfile”。

    文件将被默认的存放在服务器默认的临时目录下。在PHP运行的环境下,可以改变环境变量TMPDIR来更改这个设置。设置时,请在PHP脚本没有运行的情况下使用一个PutEnv()函数。

    接受上载文件的PHP脚本语言将贯彻何种逻辑结构是必须的来决定对上载的文件可以做些什么。例如,用户可以使用“$file_size”变量来发送任何或者太小或者太大的文件来尝试一下结果。可以使用“$file_type”变量来发送任何不符合的确定类型标准的文件。无论何中逻辑结构,您都需要在临时目录中删除这个文件,或者把它移走。

    如果没有被改名字或移动,那么在请求的最后该文件将被从临时文件夹中删除。

    请注意,在从客户端获得MIME的连接类型之后,“CERN httpd”软件似乎将剥离任何内容而以最初的白板形式出现。在这种场合,“CERN httpd”软件将不支持上载文件的特性。

HTTP cookie支持
    PHP很明显的支持HTTP cookie。Cookie是一个在远程浏览器上存储数据和跟踪或鉴定返回的用户的结构。您可以使用函数setcookie()来设置cookie。Cookie是HTTP文件头的一部分,所以该Setcookie()函数必须在任何输出向浏览器发送前被调用。这种情况和函数Header()的限制是类似的。

    任何从客户计算机发送到您那儿的cookie都将被自动的转化成一个类似于GET和POST方法数据的PHP变量。如果您希望给一个cookie指派多个值,只需要在该cookie的名字后面加上“[ ]”即可。关于更多的细节问题请参看setcookie()函数。

数据库支持
    PHP支持大量本地模式和完全ODBC等不同类型的数据库,包括:

Adabas D

MySQL

dBase

Oracle

Empress

PostgreSQL

FilePro

Solid

Informix

Sybase

InterBase

Velocis

mSQL

Unix dbm

正则表达式格式
    正则表达式在PHP中被用来处理复杂的文字串。支持正则表达式的函数有:

ereg()

ereg replace()

eregi replace()

split()

    这些函数都将正则表达式作为他们的第一个参数。PHP使用POSIX扩展规则表达式(使用POSIX 1003.2)。要找到所有的关于POSIX扩展规则表达式的描述,请查看包括在PHP发行版本之内的regex man页面。

 

    Example 2-4. Regular expression examples

    ereg("abc",$string);

/* Returns true if "abc"

is found anywhere in $string. */

 

ereg("^abc",$string);

/* Returns true if "abc"

is found at the beginning of $string. */

 

ereg("abc$",$string);

/* Returns true if "abc"

is found at the end of $string. */

 

eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);

/* Returns true if client browser

is Netscape 2, 3 or MSIE 3. */

 

ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+ )",

$string,$regs);

/* Places three space separated words

into $regs[1], $regs[2] and $regs[3]. */

 

ereg_replace("^","<BR>",$string);

/* Put a <BR> tag at the beginning of $string. */

ereg_replace("$","<BR>",$string);

/* Put a <BR> tag at the end of $string. */

 

ereg_replace("n","",$string);

/* Get rid of any carriage return

characters in $string. */

出错操作
    在PHP中有四种类型的错误和警告。它们是:

通常函数错误:1
通常警告:2
分析错误:4
注释(警告用户,可以忽略该信息,但是这个问题可能给您的代码会带来一些错误):8
    信息后面的四个数字是该信息类型的表示值,把它们加起来作为错误报告的级别。却省的报告级别是7(即1+2+4),或除了“注释”的其他组合。这个级别能够通过改变php3.ini文件中错误报告指示的方法来改变。它也可以在用户的httpd.conf文件中改变php3错误报告的方法来设置,或者在运行的时候使用脚本语言函数error reporting()来改变。

    所有的PHP表达式都可以使用前缀“@”来调用,对于这种特殊的表达式将关闭错误报告。如果一个错误在运行这样一个表达式时发生了,而且“track error”特性被置为可用,那么用户可以在全局变量$php_errormsg中找到这些错误信息。
第3章  安装

    本章将引导您如何安装和设置PHP3。并介绍必要的知识和软件。

基本的UNIX技巧(学会如何操作和“制作”一个C编译器)
一个标准的ANSI C的编译器
一个WEB服务器(显然需要)
 

通过UNIX源码编译安装
    下载源文件

   最新的源代码可以在以下网址找到:http://www.php.net

 

    快速安装说明书(Apache Module 版本)

1. gunzip apache_1.3.x.tar.gz

2. tar xvf apache_1.3.x.tar

3. gunzip php-3.0.x.tar.gz

4. tar xvf php-3.0.x.tar

5. cd apache_1.3.x

6. ./configure --prefix=/www

7. cd ../php-3.0.x

8. ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars

9. make

10. make install

11. cd ../apache_1.3.x

12. ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a

13. make

14. make install

    Instead of this step you may prefer to simply copy the httpd binaryovertop of your existing binary. Make sure you shut down yourserver first though.

    (也可以使用直接拷贝httpd的二进制文件覆盖已经存在的二进制文件的方法代替上面的步骤,但是,您必须首先关闭您的服务器。)

15. cd ../php-3.0.x

16. cp php3.ini-dist /usr/local/lib/php3.ini

    You can edit /usr/local/lib/php3.ini file to set PHP options. If you prefer this file in another location, use --with-config-file=/path in step 8.

    (您可以直接编辑/usr/local/lib/php3.ini文件来设置PHP选项,如果您将此文件存放在另一个位置,那么请在步骤8中使用with-config-file=/path)

    17. Edit your httpd.conf or srm.conf file and add:

    AddType application/x-httpd-php3 .php3 You can choose any extension you wish here. .php3 is simply the one we suggest.

    (您可以选择任何您希望的扩展,我们认为PHP3是一个十分简单的东西。)

    18. Use your normal procedure for starting the Apache server.

    (You must stop and restart the server, not just cause the server to reload by use a HUP or USR1 signal.)

    (您必须停止和重新启动服务器,而不能仅仅使用服务器的RELOAD(重新载入)功能。)

这里有两种方法来设置PHP3

    1.使用跟随PHP3而来的“setup”脚本语言。该脚本语言会询问用户一系列的问题(大多数类似于PHP/FI 2.0的“install”脚本语言)在最后运行“configure”。要运行这个脚本,请输入:“./setup”。

    这个脚本还将建立一个叫做“do-conf”的文件,这个文件将要传到设置里面去的数据。您可以编辑这个文件以改变一些设置(仅仅是一些)而无须重新运行setup程序。然后,输入:“./do-conf”使用这些选项来设置。

    2.手动的运行设置。查看您可以使用的设置选项,请输入:“./configure --help”。

    不同设置的详细资料将在下面列出。

Apache 模式
    按照Apache模式来建立PHP3,对问题“Build as an Apache module?”(按照Apache 模式建立?)应该回答“yes”(是)(设置—with-apache=DIR)然后详细的说明Apache分配的基本目录。如果您已经在“/usr/local/www/apache_1.2.4”中解压缩了了您的Apache配给包,那么这就是您的Apache分配的基本目录。缺省的目录为“/usr/local/etc/httpd”。

fhttpd 模式
    按照fhttpd 模式来建立PHP3,对问题“Build as an fhttpd module?”回答“yes”(设置—with-fhttpd=DIR)同时指定fhttpd 模式的源数据目录。缺省的目录是“/usr/local/src/fhttpd”如果您正在运行fhttpd,按照该模式建立PHP将提供更好的性能,更强的控制和远程执行能力。

CGI 版本
    缺省的设置是按照一个CGI程序来建立PHP3。如果您正在运行一个WEB服务器端的PHP3有这种模式的支持,那么一般的您出于性能的原因将会选择这种解决方案。然而,CGI版本的PHP3允许Apache用户在不同用户身份下的运行不同的使用PHP3的页面。请仔细的阅读有关安全的章节,如果您将以CGI形式来运行PHP。

数据库支持选项

    PHP对许多数据库有内置的支持(也有ODBC)

 

Adabas D
    --with-adabas=DIR

    编译的时候加入对Adabas D 数据库的支持。这个参数是Adabas D的安装目录,缺省是/usr/local/adabasd。

 

DBase
    --with-dbase

    激活内置的Dbase数据库的支持,不需要外部的库。

 

FilePro
    激活内置的只读的filePro的支持,不需要外部的库。

 

mSQL
    --with-msql=DIR

    为了激活mSQL的支持,这个选项的参数是mSQL的安装目录,并且缺省是/usr/local/Hughes。这是mSQL 2.0安装是的默认目录。Configure能自动侦测出系统所安装的mSQL版本,PHP3支持1.0和2.0两个版本。如果你编译的是PHP3和mSQL1.0版本,你只能存取1.0中的数据库和代替调度算法。

 

MySQL
    --with-mysql=DIR

    为了激活MySQL的支持,这个选项的参数是MySQL的安装目录,缺省是/usr/local/。这是MySQL安装是的缺省目录。

 

iODBC
    --with-iodbc=DIR

    包括iODBC的支持。这个特性一开始是为iODBC驱动程序管理器设计开发的,iODBC是一个免费的重新发布的ODBC驱动程序管理器,能够在很多中UNIX系统下工作。这个参数是iODBC安装的目录,默认是 /usr/local。

 

OpenLink ODBC
    --with-openlink=DIR

    包括OpenLink ODBC支持。这个选项的参数是OpenLink ODBC的安装目录,默认是 /usr/local/openlink。

 

Oracle
    --with-oracle=DIR

    包括Oracle支持。经过测试,至少在Oracle7.0和7.3下能正常工作。这个参数是ORACLE_HOME目录,如果你的Oracle环境已经被配制好了的话,你就不用指定这个参数。

 

PostgreSQL
    --with-pgsql=DIR

    包括对PostgreSQL的支持。这个参数是PostgreSQL的安装时的基准目录,默认是 /usr/local/pgsql。

 

    其他的常见数据库的支持也同上面所列的大致相同,需要时请参阅您所选择的数据库的使用说明。

其他配制选项
    --enable-sysvsem

    包括对Sys V 信号(大部分Unix系统都支持)。请参看信号和共享内存文档来获取更多信息。

 

    --enable-sysvshm

    包括对Sys V 共享内存的支持(大部分的Unix系统都支持)。请参阅信号和共享内存文档来获取更多信息。

 

    --with-xml

    包括对一种非正式版本的XML语法的支持,使用的是James Clark’s expat library。参阅XML 函数指南获取细节。

 

    --enable-maintainer-mode

    打开额外的相关和编译警告信息,这些信息经常被PHP3的开发人员所使用。

 

    --with-system-regex

    使用系统正则表达式的库胜于使用捆绑的那一个。如果你将PHP3编译为服务器组件,编译时和连接服务器时必须使用同一个库。如果系统中有你所需要的东西,就打开这个选项,如果可能,推荐你使用同PHP3捆绑在一起的库。

 

    --with-config-file-path

    这个路径是PHP3启动时用来寻找php3.ini文件位置的。

 

    --with-exec-dir

    仅仅允许在处于安全模式下的目录里执行,默认是 /usr/local/bin/。这个选项只能被设置为默认,他可以后来通过修改配制文件里的safe_mode_exec_dir来实现。

 

    --disable-debug

    在库中或执行中不包括调试信息。调试信息可以帮助你迅速查明问题所在,因此,只要PHP还处在alpha或beta的测试阶段,最好保留调试信息。

 

    --enable-safe-mode

    缺省是打开”safe_mode”(安全模式)选项,这个选项强加于PHP功能一些限制,如你只能在打开你在WEB根目录下面的文件,请详细阅读安全那一章以获得详细信息。CGI用户应该总保持这个选项是打开的。这个选项只能被设置为缺省,但是你可以后来通过修改配置文件(php3.ini)来打开或关闭这个选项。

 

    --enable-track-vars

    使用PHP3来保存从HTTP_GET_VARS, HTTP_POST_VARS 或 HTTP_COOKIE_VARS. 来的请求GWT/POST/cookie的轨迹。这个选项被设为缺省值,用户也可以在以后在 configuration file中设置track_vars的值来改变它的属性(enabled或者disabled)。

 

    --enable-magic-quotes

    设置使魔术引用成为缺省值。这个选项仅仅设置这种缺省情况,它可以使用在configuration file中指定magic_quotes_runtime的方法设置为可用或不可用。请参考有关 magic_quotes_gpc 和magic_quotes_sybase的相应内容。

 

    --enable-debugger

    激活内在的PHP3 debugger支持。这个特性还仅仅处于实验的阶段。请参考configuration file.中Debugger Configuration 的有关内容。

 

    --enable-discard-path

    如果该属性被置为可用,PHP的二进制CGI能够安全的被防置在WED树以外的地方,同时他人不能采用某种特殊的手段来获得存取权。请参考section in the security chapter中关于这个选项的内容。

 

    --enable-bcmath

    使BC风格的任意精度数学函数可以使用。请参考configuration file中有关 configuration file的选项。

 

    --enable-force-cgi-redirect

    使用安全检查内部服务器的重新定向。如果用户在Apache上运行CGI程序需要使用这个特性。

 

    当把PHP当成CGI二进制来使用时,作为缺省的设置,PHP将首先检查它是否被重新定向所使用(例如,在Apache上使用活动指示)。这将确认PHP二进制不能被用来直接调用从而跳过标准的WEB服务器身份鉴定程序,例如:http://my.host/cgi-bin/php/secret/doc.html。这个例子存取了http://my.host/secret/doc.html,但是没有进行过HTTPD为目录/secret所做的安全设置。

 

    不使用这个选项而关闭这种检查同时使用旁路HTTPD安全和身份设置。如果您要这样做的话,除非是您的服务器软件不能指出一种安全的重新定向;同时在您的文件夹根目录和用户目录中的文件将被任何人存取。

 

    请参考安全那一章中有关这个选项的内容。

 

    --disable-short-tags

    禁止短形势的PHP3标签<? ?>。如果你想使用XML(扩展标记语言)的话,就必须禁用<? ?>,那么,PHP的代码标签就只剩下<?php ?>了。这个选项只能被设置为默认。可以通过修改配置文件里的short open tag指令来打开或者关闭这个选项。

 

    --enable-url-includes

    通过include()函数,PHP3能够直接运行其它HTTP和FTP站点的代码。参阅配置文件里的include path选项。

 

    --disable-syntax-hl

    关闭语法突出显示功能。

 

    CPPFLAGS and LDFLAGS

    为了能在PHP的安装过程中能在不同的路径下找到头文件和库文件,修改cppllags和ldflags环境变量。如果你正在使用一种智能shell(命令解释程序),你应当能够设置LDFLAGS=-L/my/lib/dir CPPFLAGS=-I/my/include/dir ./configure

创建

    配置完PHP3,你即将创建可执行的CGI或PHP3的库。 Make的命令应该注意到这些问题,如果失败了,你将不知道为什么?请察看问题那一章。

测试

    如果你已经把PHP3作为CGI程序进行了创建,你可以通过make test命令来测试你的工作。建议你进行测试,在你的平台上早点发现你的PHP3的问题,好过你日后为这个问题的解决焦头烂额。
从HTML中脱离
    这儿有三种方法从HTML中脱离,同时加入“PHP代码模式”

    Example 5-1. 从HTML中脱离的方法

1. <? echo("this is the simplest, an SGML processing instructionn"); ?>

2. <?php echo("if you want to serve XML documents, do like thisn"); ?>

3. <script language="php">

echo ("some editors (like FrontPage) don't

like processing instructions");

</script>;

4. <% echo("As of PHP 3.0.4 you may optionally use ASP-style tags"); %>

语句的脱离方法
    语句的脱离方法和C及PERL是一样的------终止每一个语句时使用分号(;)。

    结束标签(?>)也暗示了说明的结束,所以下面的两句话是等价的:

<php

echo "This is a test";

?>

 

<php echo "This is a test" ?>

变量类型
    PHP支持如下的变量类型:

integer :整数
double :双精度数
string :字符串
array :队列数组
object :对象
pdfdoc (only if enabled PDF support) :PDF文本(仅仅在起用PDF支持之后生效)
pdfinfo (only if enabled PDF support) :PDF信息(仅仅在起用PDF支持之后生效)
    这些变量的类型通常不由程序员来设置;特别的,它在运行时由PHP依据上下文来设置使用什么类型。

    如果您喜欢强制将某个变量转换到指定的类型,您还可以对该变量进行“cast”操作,或者使用函数“settype()”。

 

    注意这些变量可能会在确定的情形下被不同的控制者使用,这依赖于此时该变量的类型是什么。想要获得更进一步的信息,请参考“Type Juggling”部分。

变量的初始化
    在PHP中初始化一个变量,您只需要简单的分派给它一个值即可。对于大多数类型,这样做是十分简单的;但是对于类型“Array(数组)和Objects(对象)”来说,需要使用有些不同的方法。

初始化数组
    一个数组可以使用如下的方法来初始化:使用连续的指定值,同时使用“array()”结构(这将在“Array 函数函数说明部分中被证明)。

 

    对一个数组(Array)变量连续的添加值。您简单指定无标号的Array变量的值即可。这些值会添加在该Array变量最后的元素中。

 

$names[] = "Jill"; // $names[0] = "Jill"

$names[] = "Jack"; // $names[1] = "Jack"

 

    和在C和Perl中一样,数组元素的开始号码是0而不是1。

初始化object(对象)变量
    要初始化object变量,您使用下面例子中所示的申明方法:

class foo {

function do_foo () {

echo "Doing foo.";

}

}

$bar = new foo;

$bar -> do_foo ();

变量的活动范围
    变量的活动范围仅仅限于定义它的上下文。对于绝大多数部分中所有的PHP变量仅仅只有单独的活动范围。然而,在用户自定义的函数中,引入了一个本地函数范围的概念。在这个函数中使用的任何变量缺省被限制在该函数的本地函数范围之中。例如:

 

$a = 1; /* global scope */

Function Test () {

echo $a; /* reference to local scope variable */ }

Test ();

 

    这段脚本将不会造成任何的输出,因为给显示的提交给本地译文的变量“$a”的申明,同时这个变量没有在它的活动范围中被指定一个值。您可以注意到这和C语言有一些不同,在C语言中全局变量是自动被设定为可用的,除非在函数中进行了特别的说明。由于人们可能会不小心的改变了全局变量的值,所以这可会在程序中导致许多问题。在PHP中全局变量必须在一个函数中被公告,如果想要在这个函数中使用它的话。例子如下:

 

$a = 1;

$b = 2;

Function Sum () {

global $a, $b;

$b = $a + $b;

}

Sum ();

echo $b;

 

    上面的脚本将输出“3”。在函数中申明了全局变量$a和$b,任何对这两个变量的引用都被指定到了该全局变量。这里没有函数可以操作的限制全局变量的数目。

 

    第二种接受全局变量的方法是使用PHP特殊的定义数组$GLOBALS,例子如下所示:

$a = 1;

$b = 2;

 

Function Sum () {

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

}

 

Sum ();

echo $b;

 

    $GLOBALS数组是一个联合数组使用“global”为变量的名字,全局变量作为该变量数组其中某个元素的值。

 

    另一个关于变量活动范围的重要特性是“静态变量”。一个静态变量仅仅在本地函数的活动范围中存在,但是当程序离开这个范围时,它的值并不丢失。请参考下面的例子:

 

Function Test () {

$a = 0;

echo $a;

$a++;

}

 

    这个函数每次被调用时都把变量$a置为0同时打印“0”,所以几乎是没有作用的。表达式“$a++”将增加变量的值,但是每次退出函数时变量$a就消失了。想要使用一个不丢失当前计算的记数函数,用户可以将变量$a设置为静态的,示例如下:

 

Function Test () {

static $a = 0;

echo $a;

$a++;

}

 

    现在,每一次当Test()函数被调用的时候,它将打印出变量$a和它当时增加之后的数值。

 

    当函数被递归调用的时候,使用静态变量是一种很重要的方法。递归函数就是可以调用自身的函数。当编写递归函数的时候,必须注意可能会发生的循环定义。您必须有一个适当的方法来中断这个递归过程。下面的例子递归了10次:

 

Function Test () {

static $count = 0;

$count++;

echo $count;

if ($count < 10) {

Test (); }

$count--;

}

变化变量
    有些时候使用变化变量是十分方便的。也就是说,一个变量的名字将被动态的设置和使用。一个普通的变量将会使用如下的申明:

 

    $a = "hello";

 

    一个变化变量获得一个变量的值,并将其视该变量的名字。在上面的例子中,“hello”,能够使用变量的名字加上两个$来进行使用,例如。

 

    $$a = "world";

 

    在这一点上,两个变量被定义和存储在PHP的符号树上;$a的内容为“hello”,而$hello的值为“world”。因此如下的申明:

 

    echo "$a ${$a}";

 

    制作了和如下确切相同的输出:

 

    echo "$a $hello";

 

    他们都输出:“hello world”

 

    要在数组中使用变化变量,您必须解决一个含糊的问题。它是:如果您写入了“$$a[1]”,然后解析程序将需要知道您想使用$a[1]作为变量还是使用$$a作为变量,这样索引“[1]”可能就会发生歧义。解决这种歧义的语法如下:“${$a[1]}”或者使用“${$a}[1]”(对上述的第二种情况)。

外界PHP变量
    HTML表单(GET和POST)

    当表单被提交给PHP脚本时,从该表单获得的变量将自动的被该PHP脚本设置为可用。请参考如下示例:

 

    Example 5-2. Simple form variable (简单的表单变量)

<form action="foo.php3" method="post">

Name: <input type="text" name="name"><br>

<input type="submit">

</form>

    当提交之后,PHP将建立一个变量“$name”,它将包含任何在表单中输入在“Name”中的内容。

 

    PHP同时也知道如何安排表单变量的上下文关系,但是仅仅限于一次。您可以,例如,将一组变量同时叙述,或者使用这个特性来重新从多重选择输入中获得值:

 

    Example 5-3. More complex form variables

<form action="array.html" method="post">

Name: <input type="text" name="personal[name]"><br>

Email: <input type="text" name="personal[email]"><br>

Beer: <br>

<select multiple name="beer[]">

<option value="warthog">Warthog

<option value="guinness">Guinness

</select>

<input type="submit">

</form>

 

    如果PHP的track_var特性被打开了,任何关于它的结构设置或者<?php_track_vars?>指示,然后经由POST或GET模式的变量提交将发觉使用全局联合数组“$HTTP_POST_VARS”和“$HTTP_GET_VARS”是合适的。

 

    图形提交变量名字

    当提交一个表单时,有可能使用一幅图象来代替标准的带标签的提交按钮,例如:

 

    <input type=image src="image.gif" name="sub">

 

    当用户点击该图象的任何位置时,相应的表单将被使用两个附加的变量(sub_x和sub_y)来传送到服务器上。他们包含用户点击在该图形上的相应位置信息。这将包含从浏览器发出的真实变量名字(甚至包含下划线),但是PHP将会把它自动的转化成带下划线的形式。

 

    HTTP Cookies

    PHP当然的支持使用Netscape's Spec定义的HTTP Cookies。Cookies是一种在远程浏览器上存放数据的装置,用于跟踪和鉴定用户的身份。您可以使用SetCookie()函数来对cookies进行设置。Cookies是HTTP头的一部分,所以SetCookie程序必须在被进行向浏览器输出前被调用。这和Header()函数的设置是类似的。任何从服务器送到用户处的cookies将自动的被转化成为一个PHP变量,就象使用GET和POST模式的数据一样。

 

    如果您希望对单个的cookie分派多值,只要在cookie的名字后面简单的加上一个“[ ]”即可。例如:

 

    SetCookie ("MyCookie[]", "Testing", time()+3600);

 

    注意,如果不是在您的浏览器上的域或者路径不一样的话cookie将会使用相同的名字来顶替先前的一个cookie。所以,对于购物单应用程序,您可能希望保持一个计数器同时通过cookie来传送它,例如:

 

Example 5-4. SetCookie Example (设置Cookie的例子)

$Count++;

SetCookie ("Count", $Count, time()+3600);

SetCookie ("Cart[$Count]", $item, time()+3600);

 

环境变量

    PHP自动的使用环境变量作为PHP的普通变量,例子如下。

 

    echo $HOME; /* Shows the HOME environment variable, if set. */

 

    既然信息随同GET,Post,Cookie等机制被传递进来,并且自动创建了PHP变量,有时最好是准确的从外界环境中读出一个变量以确信你正在使用正确的版本。getenv()函数就是做这个工作的,你也可以使用putenv()函数来设置一个环境变量。

服务器设置指示
变量类型变化(juggling)

    PHP不需要(或者说不支持)在声名变量明确他的变量类型;一个变量的类型是由这个变量被使用的前后关系来决定的,也就是说,如果你给一个变量var赋了一个字符串的值,var就变成了字符串变量。如果你再将一个整数赋值给var,他又变成了一个整数型变量。

    一个PHP自动转化变量类型的例子是加法的操作符’+’。如果任何一个操作数都是双精度数,那么所有的操作数被当作双精度数求值,并且结果也是双精度数。否则,操作数将被认为是整数,结果也将会是整数。注意这并不影响每个操作数本身的变量类型,唯一的变化就是操作数在计算的过程中被如何处理。

$foo = "0"; // $foo 是一个字符串 ,值是“0”(ASCII 48)

$foo++; // $foo 是一个字符串,值是“1”(ASCII 49)

$foo += 1; // $foo 现在是一个整数(2)了

$foo = $foo + 1.3; // $foo 现在是一个双精度数(3.3)了

$foo = 5 + "10 Little Piggies"; // $foo 是一个整数 (15)

$foo = 5 + "10 Small Pigs"; // $foo 是一个整数 (15)

 

    如果你觉得上面例子中最后两个表达式看起来有点奇怪的话,请看 “字符串的转化”部分。

    如果你希望强制一个变量被当作某种固定的类型来计算,请看 “类型强制(casting)” 一节。如果你希望转变一个变量的类型,请看函数“settype()”的说明。

 

    确定一个变量的类型

    因为PHP自己决定变量的类型并且一般按照需要转化他们,一个特定的变量的类型不是在任何时间都非常明显。PHP包括一些函数可以找出这个变量的类型。这些函数是gettype(), is_long(), is_double(), is_string(), is_array(), 和 is_object().

 

    类型强制(type casting)

    在PHP中类型强制同在C语言中大抵相似:将需要的类型的种类写在要强制的变量的前面的圆括号中。

$foo = 10; // $foo 是一个整数

$bar = (double) $foo; // $bar 是一个双精度数

以下的强制方式是允许的:

(int), (integer) – 强制成整数

(real), (double), (float) – 强制成双精度数

(string) – 强制成字符串

(array) – 强制成数组

(object) – 强制成对象

注意在圆括号中允许制表符(tabs)和空格(spaces) ,因此下面的语句是等价的:

$foo = (int) $bar;

$foo = ( int ) $bar;

 

字符串转化

    当一个字符串被当作数字型的值来计算时,他的结果和类型如下面所述的决定。

    如果这个字符串含有字符’.’,’e’,或者’E’,则被当作双精度类型变量来处理,否则当作是整数。

    这个字符串的值由词首部分决定。如果这个字符串以任何有效的数字的数据开始,那么这个数字数据就是这个字符串参加运算的值。否则,值为零(zero)。有效的数字数据是遵循下面的这些标记的,跟随在一个或多个数字后面(可以包含小数点),跟随在一个可选的指数后面。指数是由一个或多个数字跟在’e’或’E’后面构成的。

 

$foo = 1 + "10.5"; // $foo 是双精度数 (11.5)

$foo = 1 + "-1.3e3"; // $foo 是双精度数(-1299)

$foo = 1 + "bob-1.3e3"; // $foo 是整数 (1)

$foo = 1 + "bob3"; // $foo 是整数 (1)

$foo = 1 + "10 Small Pigs"; // $foo 是整数 (11)

$foo = 1 + "10 Little Piggies"; // $foo 是整数 (11);

// 这个字符串包括字符'e'

    为了获取更多信息,请参考Unix手册关于strtod(3)的部分。

数组操作
    PHP同时支持标量数组(scalar array)和关联数组(associative arrays)。事实上,这两者之间没有任何区别。你可以使用函数list()或array()来创建数组,或者你可以明确的设置每一个数组元素的值。

$a[0] = "abc";

$a[1] = "def";

$b["foo"] = 13;

    你也可以通过向数组里添加数值来创建数组。

$a[] = "hello"; // $a[2] == "hello"

$a[] = "world"; // $a[3] == "world"

    数组可以通过函数 asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), 和ksort() 来进行排序,具体使用那一个函数要根据你所想的排序的类型来定。

    你可以使用cunt( )函数来统计数组中元素的个数。

    你可以使用next()和prev()函数来遍历数组。另一个普通的遍历数组的方式是使用函数each()。
任何PHP脚本语言都是使用连续的语句创建的。一个语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句甚至一个不做任何事情的语句(一个空的语句)。语句经常使用分号(;)结尾。另外,利用卷支持可以把一组语句压缩从而使语句可以被组成语句组。一个语句组是一个关于自身的申明。不同的语句类型将在本章被描述。

 

常量
    PHP定义了一些常量提供给结构使它能够在运行时定义更多的类型。常量和变量十分的类似,但是他们在语法上有些微的不同。

    被预定义的常量是__FILE__ 和__LINE__,在处理他们时,会发现他们与文件名和行号相符合。请参考如下示例:

 

Example 6-1. Using __FILE__ and __LINE__ //使用__FILE__ 和__LINE__

<?php

function report_error($file, $line, $message) {

echo "An error occured in $file on line $line: $message.";

}

 

report_error(__FILE__,__LINE__, "Something went wrong!");

?>

 

    您可以使用函数define() 和undefine()来定义其它的常量。

 

    Example 6-2. Defining Constants //定义常量

<?php

define("CONSTANT", "Hello world.");

echo CONSTANT; // outputs "Hello world."

undefine ("CONSTANT");

?>

表达式

    表达式是PHP最重要的基石。在PHP中,您所写的几乎所有的内容都是表达式。最简单同时也是最精确的定义一个表达式的方法是“任何内容都有它的值”。

 

    立刻进入大脑的简单例子是:常量和变量。当您输入“$a = 5”,您就把值“5”赋给了变量“$a”,明显的,获得这个数值5,或者说’5’是一个值为5的表达式(在这个例子中,’5’是一个整数常量)。

    赋值以后$a的值是5, 因此如果你这样写$b = $a,你它同$b = 5所表达的意思是一样的.换句话说,$a是一个值为5的表达式.如果一切工作正常,这些将是所发生的一切.

    再稍微复杂一点的表达式的例子是函数(function) .例如,考虑以下下面的函数:

 

function foo () {

return 5;

}

 

    假设你熟悉函数的概念(如果你不熟悉,看一下第四章),你可能假设$c=foo()从本质上说同$c=5是一致的,你是正确的.函数是以他们的返回值为值得表达式.既然foo()返回5,表达式’foo()’的值就是5。一般来说,函数不会仅仅返回一个态的值,他们一般都计算一些东西。

    当然,PHP里面的值不必须是整数,并且经常他们不是PHP支持三种标量类型的数值:整数,浮点数,和字符串。(标量值是不能被再分为更小部分的数值,例如它不能是数组)。php也支持两种合成类型的数值:数组和对象。每一种数据类型都能被赋值给变量或者通过函数返回。

    迄今为止,PHP/FI 2的用户不应该感觉到任何改变。然而,PHP把表达式带入了一个更深的层次,如同许多其它语言所作的一样。PHP是一种面向表达式的语言,几乎每一件事都是一个表达式.考虑一下我们已经处理过的表达式“$a=5”.可以非常容易的看出这里包含了两个值,常量’5’的值,和$a的值。$a的值也已经被更新成5。但是事实是这里还有一个额外的值包含其中,并且这个值就是赋值语句本身.这个赋值语句本身计算所赋值的数值,在这个例子中是5。实际上,它意味着“$a=5”,不管他做什么,是一个值为5的表达式。因此,一些像’$b=($a=5)’的表达式,实际上同’$a=5;$b=5’(分号代表表达式的结束)是一样的.既然赋值语句被以从右到左的顺序解析,你还可以这样写’$b=$a=5’。

    另一个很好的表达式的例子是前和后递增量的方向性.PHP/FI 2的用户和许多其他语言的用户也许对符号(variable(变量)++和variable--)非常熟悉.这些就是递增和递减符号.在PHP/FI 2中,语句’$a++’没有任何值(不是一个表达式),并且因此你不能给它赋值或以任何方式来使用它.PHP通过发展这些表达式加强了递增(increment)/递减(decrement)的能力,像c语言中一样.在PHP中,有两种递增形式-前递增和后递增.这两种递增本质上都是使变量加1,并且对变量的影响都是一样的.他们的区别是递增表达式本身的值.前递增的形式是’++$variable(变量)’,计算递增值(PHP 在读出它的值之前递增变量的值,因此叫前递增)后递增的形式是’$variable++’,在变量递增前计算$variable的原始值(PHP先读出变量的值,然后再递增,因此叫后递增).

    表达式的最后一个例子我们将处理组合操作符赋值表达式.你已经知道了如果你想将变量$a的值加1,你可以简单的写成’$a++’或’++$a’.但是如果你想加的数值不只是1呢,例如3?你可以多次使用’$a++’,但是很明显这样不是一个有效的,简洁的方式.通常的方法是这样写’$a=$a+3’. ’$a=$a+3’计算变量$a加3后的值,并且被重新赋值给了变量$a,最终的结果是变量$a的值加了3.在PHP中,如同像C一样的其它一些语言,你可以用更简短的方式来做这些.给变量$a的当前值加3可以写’$a+=3’.这个表达式正确的意思是”读出$a的值,加3,然后把它赋值给$a”.除了更加简洁和简略外,这样的语句执行起来速度更快.表达式’$a+=3’的值,像一个正则赋值语句的值.是被赋予的值.注意它不是3,而是$a+3的组合的值(这是一个被赋给$a的值).任何二元操作符都可以被用来组合成复合赋值操作符.例如,’$a-=5’($a=$a-5),’$b*=7’($b乘以7),等等.

    如果你没有在其它语言中加过的话,你会认为下面的表达式看起来非常奇怪.这就是三元条件算子:

    $first ? $second : $third

    如果第一个子表达式的值为真的话(非0),那么他的第二个子表达式将被计算,并且这就是整个条件表达式的值.否则,第三个子表达式将被预算,结果作为整个条件表达式的值.

    下面的例子可以帮助你大体上理解前,后递增和表达式.

function double($i) { return $i*2;}

$b = $a = 5; /* 把5赋值$a和$b */

$c = $a++; /* 后递增, 把$a的原始值(5)赋值给$c */

$e = $d = ++$b; /* 前递增, 把经过递增操作的$b的值(6)赋值给$e和$d */

/* 这时,$d和$e都等于(6) */

$f = double($d++); /* 把$d的原始值(6)加倍,然后赋值给$f.$f等于(12)*/

$g = double(++$e); /* 先把$e执行递增操作,然后加倍, 2*7 = 14赋值给$g*/

$h = $g += 10; /* 首先,$g加10,并且最终结果是24.将这个值赋值给$h,并且$h最终的结果也是24.*/

    在本章的一开始,我们就说过”我们将描述各种类型的语句”.表达式可以成为语句,然而,并不是每一个表达式都是一个语句.既然这样,一个语句具有’expr’’;’的形式,一个表达式加上一个分号.在’$b=$a=5;’中,$a=5是一个有效的表达式,但是他不能由他自己构成一个语句.但是’$b=$a=5;’却是一个有效的语句.

    最后一个值得提起的事情是一个表达式的值的真假.在很多事件中,主要在条件执行和循环中,你对表达式的确切的值并不感兴趣,你仅仅对他是否以为着 TRUE(真)或FALSE(假)(PHP没有专门的boolean类型).在PHP中计算表达式的真假的方式同perl非常相似.任何非零的数值都是TRUE,零是FALSE!注意负数也非零,所以也为真!空字符串和字符’0’为FALSE;所有其他字符串为TRUE.对于非标量的数值(数组或对象)-如果值没有包含任何元素,则被认为为FALSE,否则为TRUE.

    PHP提供了一个完整而且强大的表达式工具,并且完全说明他已经超出了本手册的范围.关于表达式是什么,你怎么才能构造一个有效的表达市,上面的例子应该给了你一个很好的提示.贯穿这个手册的其余部分,我们将用’expr’代表有效的PHP表达式.

 

IF
    IF结构是任何语言中最重要的特性之一,PHP也包括了它。它允许进行条件判断同时执行相应的程序段。PHP中IF语句的特性和C是十分类似的:

if (expr)

statement

    在对该表达式片段的描述后,会判断表达式的值是否为真。如果表达式的值为真,PHP会执行该语句,如果该值为假,那么PHP将会跳过该语句。

 

    接下来的例子中如果$a比$b大,那么将显示“a is bigger than b”。

if ($a > $b)

print "a is bigger than b";

 

    通常的情况,是用户希望使用不只一条语句被有条件的执行。当然,在这里没有必要对每一个语句使用IF条件判断。用户可以使用一组语句来实现这个功能。例如,如果$a比$b大,那么下面的代码将显示“a is bigger than b”,同时将$a的值赋给$b。

if ($a > $b) {

print "a is bigger than b";

$b = $a;

}

 

    IF语句可以嵌套在另一个IF语句之中,利用这一点,用户可以根据不同的情况执行程序中不同的部分。

 

ELSE
    通常,可能在条件符合时希望运行某个语句,而在条件不符合时希望运行另一段程序。这就是ELSE语句的作用。ELSE扩展了IF语句的作用,当条件为假时,ELSE后面的语句将被执行。例如,接下来的程序段将在$a大于$b的时候显示“a is bigger than b”,在其他的情况下显示“a is NOT bigger than b”。

if ($a > $b) {

print "a is bigger than b";

} else {

print "a is NOT bigger than b";

}

 

    ELSE语句并不仅仅起到在IF表达式值为假的时候执行语句的作用,如果在它后面接上IF的话,就成为了ELSEIF语句,使用它可以进一步的分析假的情况(见下文)。

 

ELSEIF
 

    正如它的名字所暗示的,ELSEIF是IF和ELSE的组合。和ELSE一样它扩展了IF语句对FALSE(假)的处理。但是和ELSE不一样的是,ELSEIF将已经为假的条件再进行一次判断,并根据判断的结果进行处理。例如,下列代码在$a>$b的情况下将显示“a is bigger than b”,当$a不大于$b的时候就再进行一次判断,如果$a==$b,将显示“a is equal to b”,如果$a<$b将显示“a is smaller than b”。

if ($a > $b) {

print "a is bigger than b";

} elseif ($a == $b) {

print "a is equal to b";

} else {

print "a is smaller than b";

}

 

    在同一个IF语句中可以有多个ELSEIF语句。第一个ELSEIF表达式(if any)如果为真,那么将被执行。在PHP3中,您也可以写成“else if”(使用两个词)同时效果和使用“elseif”(一个词)是一样的。他们的语言仅仅有些微的不一样(如果您熟悉C语言的话,您会发现这个不一样和在C中类似)但是最终他们的结果是完全一样的。

 

    ELSEIF语句仅仅在IF语句或前一个ELSEIF的表达式为假,同时当前的ELSEIF语句表达式为真的情况下执行。

 

IF语句的交互语法:IF().. ..ENDIF
    PHP3提供了一种不同的方法在IF语句中建立语句组。这种方式在您将HTML嵌套进IF语句中非常常见,但是您可以将着种方法应用到任何位置。除了使用{}之外,IF表达式可以跟随一个冒号,一个或多个语句,然后使用ENDIF结尾;请注意如下的例子:

 

<?php if ($a==5): ?>

A = 5

<?php endif; ?>

 

    在上面所示的例子中,利用交互语法,HTML语句“A = 5”被嵌套进了IF语句之中。这个HTML语句会在$a为5的时候被显示。

    这种交互语法也可以应用在ELSE和ELSEIF语句之中。接下来的例子是使用交互格式的IF、ELSEIF和ELSE语句。

if ($a == 5):

print "a equals 5";

print "...";

elseif ($a == 6):

print "a equals 6";

print "!!!";

else:

print "a is neither 5 nor 6";

endif;

 

WHILE
    WHILE循环是PHP3中循环的一个简单例子。它和在C中的表现完全一样,WHILE语句基本的结构如下所示:

    WHILE(expr) statement

 

    WHILE语句的的含义是十分简单的。它告诉PHP在WHILE表达式为真的情况下反复的执行嵌套的语句。表达式的值在每一次循环开始的时候被检查,所以即使这个值在执行嵌套的语句时被更改了,执行过程将不会被终止,直到结束该次循环为止。有些情况下,WHILE表达式的值在开始就是假,那么这些嵌套的语句将一次也不会被执行。

    和使用IF语句类似,您可以在同一个WHILE循环中使用多个语句作为一个组,使用{ }或类似于下文的语法:

    WHILE(expr): statement ... ENDWHILE;

    在下面的两个例子实现的功能是相同的,即打印了从1到10的所有数字:

 

    /* example 1 */

$i = 1;while ($i <= 10) {

print $i++; /* the printed value would be

$i before the increment

(post-increment) */

}

 

/*example 2 */

$i = 1;

while ($i <= 10):

print $i;

$i++;

endwhile;

 

DO..WHILE
    DO..WHILE循环和WHILE循环是十分类似的,除了真值检查是在每个循环过程最后进行的外。这里最主要的不同就是对于DO..WHILE循环,它和标准的WHILE循环不一样,它的第一个循环过程总是会被执行的(由于真值检查是在最后被执行的)。标准的WHILE循环中的第一个语句不一定被执行(由于真值检查是在循环开始时进行的)。

 

    这儿是使用DO..WHILE循环语句的一个例子:

$i = 0;

do {

print $i;

} while ($i>0);

 

    上文的循环仅仅会被执行一次,在第一次循环执行完毕之后,检查表达式为假($I并不比0大)此时循环就会被终止。

 

    高级的C语言使用者对使用DO..WHILE循环的不同之处会有很深的理解,为了允许在代码段的执行过程中终止执行,可以使用将他们加入DO..WHILE(0)语句中,再使用BREAK语句的方法。下面代码段说明了这一点:

do {

if ($i < 5) {

print "i is not big enough";

break;

}

$i *= $factor;

if ($i < $minimum_limit) {

break;

}

print "i is ok";

...process i...

} while(0);

 

    如果您对这些都不是很明白的话,也不必担心。您可以在不使用这些特性的情况下编写出很强有力的代码。

 

FOR
    在PHP中FOR循环是最复杂的循环。它的特性和它在C语言中的表现类似。FOR循环的语法如下:

 

    FOR (expr1; expr2; expr3) statement

 

    第一个表达式expr1将在循环开始时无条件的被求解执行;

    在每一个循环开始的时候,第二个表达式将被执行。如果它的值为真,则该循环将继续下面嵌套语句的执行。如果它的值为假,则循环结束;

    在每个循环的最后第三个表达式将被执行。

    任何一个表达式都可以是空的,当表达式二(expr2)是空的时候,意味这这个循环运行的次数将是不确定的(PHP和C一样默认该表达式为真)。这种做法并不象您想象的那样没有用,因为在有些情况下您可能希望使用带条件的BREAK语句来取代FOR的真值判断来作为终止循环的方法。

 

    注意下面的几个例子,所有的这些语句显示了从1到10的数字:

 

/* example 1 */

for ($i = 1; $i <= 10; $i++) {

print $i;

}

 

/* example 2 */

for ($i = 1;;$i++) {

if ($i > 10) {

break;

}

print $i;

}

 

/* example 3 */

$i = 1;for (;;) {

if ($i > 10)

{ break;

}

print $i;

$i++;

}

 

/* example 4 */

for ($i = 1; $i <= 10; print $i, $i++) ;

 

    当然,看上去第一个例子最好(或者是第四个例子),但是您将发现在许多场合使用空表达式的FOR循环是十分方便的。

 

    在FOR循环中PHP也支持交互的“冒号语法”。例如:

    FOR (expr1; expr2; expr3): statement; ...; endfor;

 

    其他有FOR语句的语言往往使用该语句来处理数组。在PHP中使用WHILE语句和list()和each()函数来做这件事情。请参考这些函数相关的例子。

 

BREAK
    BREAD 跳出当前的循环体,提前结束循环.

$i = 0;

while ($i < 10) {

if ($arr[$i] == "stop") {

break;

}

$i++;

}

 

CONTINUE
    CONTINUE结束本次循环,跳到循环体的开始处,接着进行下一次循环的判定.

while (list($key,$value) = each($arr)) {

if ($key % 2) { // skip even members

continue;

}

do_something_odd ($value);

}

 

SWITCH
    在实际问题中常常需要用到多分支的选择.你可以使用多重嵌套的IF语句来处理,但如果分支较多,则嵌套的IF语句层数多,程序冗长而且可读性降低.PHP中提供SWITCH语句来直接处理多分支选择.

    下面的两个例子使通过两种不同的方式来实现同一件事,一个使用了一系列的IF语句,另外一个使用了SWITCH语句:

 

/* example 1 */

 

if ($i == 0) {

print "i equals 0";

}

if ($i == 1) {

print "i equals 1";

}

if ($i == 2) {

print "i equals 2";

}

 

/* example 2 */

 

switch ($i) {

case 0:

print "i equals 0";

break;

case 1:

print "i equals 1";

break;

case 2:

print "i equals 2";

break;

}
    为了理解SWITCH语句为了躲避语句冗长,知道它如何被执行的是非常重要的.SWITCH语句石一行一行     执行的(事实上,是一条语句一条语句).在开始时,没有代码被执行.仅仅当一个值于SWITCH表达式的语句的值相同的CASE语句被发现后,PHP继续执行语句直到SWITCH体的结束,或者出现了BREAK语句.如果你在一个分支语句的后面没有写BREAK语句,PHP将继续执行下面分支的语句.例如:

 

/* example 3 */

 

switch ($i) {

case 0:

print "i equals 0";

case 1:

print "i equals 1";

case 2:

print "i equals 2";

}

 

    这里,如果$i等于0,PHP将会执行所有打印语句.如果$i等于1,PHP将会执行剩下的两个打印语句,并且仅仅当$i等于2的时候,你才能得到你期望的执行结果,只有’I equals 2’被显示.因此不要在每一个分支语句的后面忘记BREAK语句(即使你在一定的环境下有可能想避免提供他们).

    一个特殊的分支是默认的分支.这个分支可以匹配任何其它分支没有匹配的事情.例如:

 

/* example 4 */

 

switch ($i) {

case 0:

print "i equals 0";

break;

case 1:

print "i equals 1";

break;

case 2:

print "i equals 2";

break;

default:

print "i is not equal to 0, 1 or 2";

}

 

    另外一个值得一提的事实是CASE表达式可以是任何计算标量类型的表达式,也就是说,整型或实型和字符型.数组和对象将不会导致PHP崩溃,但是他们没有没有任何意义.

 

REQUIRE
    REQUIRE语句使用指定的文件来代替它自己,与C语言中的#include语句非常相似。这意味着你不能把一个require()语句放在一个循环体中,并且期望它在每一次反复中都包含不同文件的内容.为了达到这个目的,可以使用INCLUDE语句。

    require ('header.inc');

     

INCLUDE
    INCLUDE语句包括和计算指定文件.

    在每次遭遇INCLUDE语句的时候都会进行一次.因此你可以在一个循环体中使用INCLUDE语句.以用来包含一些不同的文件.

$files = array ('first.inc', 'second.inc', 'third.inc');

for ($i = 0; $i < count($files); $i++) {

include($files[$i]);

}

    INCLUDE()与REQUIRE()语句是不同的,include语句是每一次都重新计算(并且仅仅当它被执行的时候),而require()语句当他第一次被碰到的时候,用指定的文件来代替它本身,无论这个文件的内容是否被计算(例如,如果它出现在一个条件为FALSE的if语句中).

    因为include()是一个特殊的语言结构,你必须在一个语法块中封闭它,如果它在一个条件块中.

 

    /*错误,不会同设想一样工作. */

 

if ($condition)

include($file);

else

include($other);

 

/*下面是正确的. */

 

if ($condition)

{

include($file);

}

else {

include($other);

}

 

    当一个文件被计算的时候,语法分析将处在”HTML-模式”中,这个模式将输出这个文件的内容直到第一个PHP开始标签(<?)被遇到.

    参考 readfile(),virtual().

函数

    一个function(函数)可以使用如下语法来定义

function foo ($arg_1, $arg_2, ..., $arg_n) {

echo "Example function.n";

return $retval;

}

    任何有效的PHP代码可以出现在function(函数)中,即使是其它的函数或类定义.

    Function必须在他们被引用之前定义.

返回值

    使用一些可选的返回语句,任何类型的数值都能被返回,包括对象和广义表.

function my_sqrt ($num)

{

return $num * $num;

}

echo my_sqrt (4); // 输出 '16'.

 

    可以返回多值,但是同时的影响使通过一个广义表来实现:

function foo()

{

return array (0, 1, 2);

}

list ($zero, $one, $two) = foo();

参数

    通过参数表可以传递信息到函数,这个表可以是变量或常量以逗号(,)分隔构成的。

    PHP3支持使用值来传递变量(默认),通过调用传递,和默认的参数值.可变长度的参数列表目前不被支持,但是可以通过传递数组来实现.

function takes_array($input) {

echo "$input[0] + $input[1] = ", $input[0]+$input[1];

}

通过调用传递(Passing by reference)

    默认的,函数参数通过值来传递.如果你希望允许一个函数可以修改它的参数的值,你可以通过调用来传递他们.

    如果你希望一个函数参数意志通过引用被传递,你可以预先函数定义中在参数名前加符号(&):

function foo( &$bar ) {

$bar .= ' and something extra.';

}

$str = 'This is a string, ';

foo ($str);

echo $str; // 输出 'This is a string, and something extra.'

    如果你希望向一个不是用这种方式定义的函数用调用的方式传递参数,你可以在函数调用中的参数名称前加符号(&).

function foo ($bar) {

$bar .= ' and something extra.';

}

$str = 'This is a string, ';

foo ($str);

echo $str; //输出 'This is a string, '

foo (&$str);

echo $str; //输出 'This is a string, and something extra.'

默认值
    一个函数对于标量参数可以定义C++-风格的默认值.

function makecoffee ($type = "cappucino") {

echo "Making a cup of $type.n";

}

echo makecoffee ();

echo makecoffee ("espresso");

    上面的程序段的输出如下:

Making a cup of cappucino.

Making a cup of espresso.

    默认值必须是一个常量表达式,不是一个变量或类成员.

    注意当时用默认参数时,任何默认都应该在任何非默认参数右边;否则,事情将不会想你所想的那样.考虑下面的程序段:

function makeyogurt ($type = "acidophilus", $flavour) {

return "Making a bowl of $type $flavour.n";

}

echo makeyogurt ("raspberry"); // 将不会按照预想工作

    上面例子的输出是:

Warning: Missing argument 2 in call to makeyogurt() in

/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41

Making a bowl of raspberry .

    现在,用下面的对比上面的:

function makeyogurt ($flavour, $type = "acidophilus"){

return "Making a bowl of $type $flavour.n";

}

echo makeyogurt (“raspberry”);//正常工作

    这个例子的输出是:

    Making a bowl of acidophilus raspberry.

OLD_FUNCTION

    OLD_FUNCTION语句允许你声明一个使用PHP/FI2 的语法的函数(你需要做的就是把’function’替换成’old_function’.

    这是一个不被赞成的特征,并且应该仅仅被PHP/FI2到PHP3的转换这使用.

    定义成为OLD_FUNCTION模式的函数不能被PHP的内部代码调用。其中之一的情况是,意味着您不能在象as usort()、array_walk()和register_shutdown_function().这样的函数中使用使用他们。您可以使用编写交换函数的方法来调用OLD_FUNCTION模式的函数(在普通的PHP3表单中)。

CLASS

    一个class是一个变量和使用这些变量的函数的组合。定义class使用如下的语法:

<?phpclass Cart { var $items; // Items in our shopping cart

// Add $num articles of $artnr to the cart

function add_item ($artnr, $num) { $this->items[$artnr] += $num; }

// Take $num articles of $artnr out of the cart

function remove_item ($artnr, $num) {

if ($this->items[$artnr] > $num) {

$this->items[$artnr] -= $num;

return true;

} else {

return false;

}

}

}

?>

 

    如上所示,定义了一个名字为Cart的class。这个class由多个描写物品的数组和添加项目、删除项目的函数组成。

 

    Class是一种类型,这就是说,它是实际变量的设计蓝图。您可以根据设计建立一个变量组和针对它们的一些新的操作。示例如下:

 

$cart = new Cart;

$cart->add_item("10", 1);

 

    如上所示,建立了一个类型为class Cart的对象$cart。这个对象中的函数add_item()被调用来添加一个物品号为10的项目。

 

    Class可以使用其他的Class来扩展。这个扩展的或者继承的class(类)拥有基本class所有的变量和函数同时您还可以在其中加如您自己做的扩展定义。要这样定义需要使用扩展定义的关键词。

 

class Named_Cart extends Cart {

var $owner;

function set_owner ($name) {

$this->owner = $name;

}

}

 

    以上定义了一个名字为Named_Cart的class(类),这个类拥有所有包含于类Cart中的变量和函数,同时还添加了一个变量$owner和函数set_owner()。您可以建立一个有名字的cart,同时获得cart的拥有者名字。您还可以在类Named_Cart中,使用普通的属于类cart的函数。

 

$ncart = new Named_Cart; // Create a named cart

$ncart->set_owner ("kris"); // Name that cart

print $ncart->owner; // print the cart owners name

$ncart->add_item ("10", 1); // (inherited functionality from cart)

 

    在这个类的函数中变量$this表示这个对象。在当前的对象中,您可以使用$this->something来访问任何变量和函数。

 

    当您建立一个新的类时,有一个构造器函数将被自动的调用。如果某个函数的名字和类的名字一样,那么它就成为构造器:

 

class Auto_Cart extends Cart {

function Auto_Cart () {

$this->add_item ("10", 1);

}

}

 

    在上面的例子中,定义了一个名字为Auto_Cart的类,它是在原来的类Cart中加上了一个构造器函数,这个构造器函数初始化了类Cart使用的方法是:在每次建立一个类的时候添加一个物品号为10的一个项目。构造器还可以显示一些信息,这些信息可以被随意的挑选,这使他们可以变的十分的有用,

 

class Constructor_Cart {

function Constructor_Cart ($item = "10", $num = 1) {

$this->add_item ($item, $num);

}

}

// Shop the same old boring stuff

$default_cart = new Constructor_Cart;

// Shop for real...

$different_cart = new Constructor_Cart ("20", 17);
算术操作符

    这些工作和基本的学校里教的内容相似。

 

    Table 7-1. Arithmetic Operators(表7-1算术操作符)

example name result
$a + $b Addition Sum of $a and $b.?/FONT>
$a - $b Subtraction Remainder of $b subtracted from $a.?/FONT>
$a * $b Multiplication Product of $a and $b.?/FONT>
$a / $b Division Dividend of $a and $b.?/FONT>
$a % $b Modulus Remainder of $a divided by $b.

 

    其中,除法操作符“/”返回一个整数值(整数除法的结果)如果两个操作数是整数(或者是被转化成整数的字符串)的话。如果任意一个操作数是浮点数,那么将进行浮点运算。

字符串操作符

这个地方仅仅有一个真正的字符串操作符:串联符号“.”。

 

$a = "Hello ";$b = $a . "World!";

// now $b = "Hello World!"

赋值操作符

    基本的赋值操作符就是“=”。您往往会倾向于认为它的含义就是“等于”。不要这样想,它真正的含义就是左侧的操作数获得右侧表达式的值。

 

    一个赋值表达式的意义在于值的指派。也就是说,“$a=3”的值是3。这就允许您做这样的事情:

 

$a = ($b = 4) + 5;

// $a is equal to 9 now, and $b has been set to 4.

 

    作为赋值操作符的一个补充,还有一个针对二进制数和字符传进行操作的组合操作符,该操作符允许您在赋值方采用被赋值表达式的值。例如:

 

$a = 3;

$a += 5; // sets $a to 8, as if we had said: $a = $a + 5;

$b = "Hello ";

$b .= "There!"; // sets $b to "Hello There!", just like $b = $b . "There!";

位操作符

    位操作符允许您精细的操作数据的每一个位。

 

    Table 7-2. Bitwise Operators(表7-2位操作符)

example     name                  result
$a & $b    And    Bits that are set in both $a and $b are set.?/FONT>
$a | $b    Or     Bits that are set in either $a or $b are set.?/FONT>
~ $a?/FONT> Not   Bits that are set in $a are not set, and vice versa.

逻辑操作符

    Table 7-3. Logical Operators(表7-3 逻辑操作符)

 

example      name                    result?/FONT>
$a and $b    And          True of both $a and $b are true.?/FONT>
$a or $b     Or?/FONT>    True if either $a or $b is true.?/FONT>
$a xor $b    Or?/FONT>    True if either $a or $b is true, but not both.?/FONT>
! $a        Not?/FONT>    True if $a is not true.?/FONT>
$a && $b    And?/FONT>    True of both $a and $b are true.?/FONT>
$a || $b    Or?/FONT>     True if either $a or $b is true.

比较操作符

    比较操作符,正如它的名字所示,允许您比较两个值。

 

    Table 7-4. Comparson Operators(表7-4 比较操作符)

example          name       result?/FONT>
$a == $b Equal?/FONT>  True if $a is equal to $b.?/FONT>
$a != $b Not equal    True if $a is not equal to $b.?/FONT>
$a < $b Less than?/FONT>   True if $a is strictly less than $b.?/FONT>
$a > $b Greater than?/FONT>   True if $a is strictly greater than $b.?/FONT>
$a <= $b Less than or equal to?/FONT>  True if $a is less than or equal to $b.?/FONT>
$a >= $b Greater than or equal to?/FONT>  True if $a is greater than or equal to $b.
字符串操作函数

    PHP3.0中的字符串操作功能是比较多的,重要的有以下这些:

    (1)echo,print,printf,sprintf

    用于输出字符串.字符串中如果有变量名则被替换成其值. 后两个函数类似于C的同名函数.

 

    (2)strchr, strlen, strtok, strrchr, strrev, strstr, strtolower, strtoupper, substr, ucfirst

    用的字符串操作函数,有些和C中的同名函数意义完全一致. strrev是把一个字符串翻转. strtolower和strtoupper是将字符串转换为小写和大写.ucfirst是把字符串的第一个字符变成大写. substr是返回字符串的一个子串,用法是:substr(字符串,头,长度).头位置是 从0算起的.如果是负数,则是从尾部向前数的意思.

 

    (3)Chr,Ord

    同名函数.

 

    (4)explode,implode,join

    与数组有关的函数. explode(字符串,分割符)返回一个将字符串在分割符处分开所产生的数组. implode(数组,分割符)返回一个将数组各元素之间插上分割符而成的字符串. join与implode意义相同.

 

    (5)Chop

    处理串尾部的空白.

 

    (6)htmlspecialchars

    将HTML特殊字符换成它们的名字,例如"<"变成"<".

 

    (7)nl2br

    在HTML中的每一个回车前面加上"<BR>".

 

    (8)AddSlashes,StripSlashes

    给字符串中按照需要加上""和去掉"",对于某些数据库,必须在要查询的字符加上和去掉""之后才能够查询.

 

    (9)parse_str

    将"name1=value1&name2=value2&..."类型的字符串分析成一些变量.

 

    例如: parse_str("a=1&b=2"); 生成$a与$b两个变量,值分别为1,2. 如果有两对名字/值的名字部分相同,则后一个的值覆盖前一个的. 如果这两对的名字尾部都有"[]",例如"a[]=1&a[]=2",则生成数组$a,两个元素分别为1,2.

正规表达式函数     

    PHP与其它跨平台语言(也许Java不在其列. :))类似,也有正规表达式功能. PHP3.0的正规表达式功能当然远远比不上Perl,但还是足够用的,主要函数有这么些:

    (1)ereg,eregi

    这是正规表达式匹配函数,前者是大小写有关匹配,后者则是无关的.

    用法: ereg(正规表达式,字符串,[匹配部分数组名]);

    PHP3.0中的正规表达式大体类似于grep中用的.

 

    (2)ereg_replace,eregi_replace

    这些是替换函数.

    用法:

    ereg_replace(正规表达式,替换串,原字符串);

    字符串处理函数中有一个strtr,是"翻译"函数,类似于Perl中的tr/.../.../,

    用法: strtr(字符串,"从","到");

    例如:strtr("aaabb","ab","cd")返回"cccdd".

    

    (3)split

    与explode函数有些类似,但这次可以在匹配某正规表达式的地方分割字符串.

    用法:

    split(正规表达式,字符串,[取出前多少项]);

文件操作函数

    PHP3.0中的文件操作函数大体和C的类似,但有一些扩充,特别是除了支持

    对本机文件的访问外,也支持对HTTP和FTP的URL进行访问,只要把这些URL作为文件名传递给文件操作函数就可以了.

    主要的文件操作函数有:

    (1)fclose, feof, fgetc, fgets, fopen, fputs, fseek, ftell, mkdir, readlink, rename, rewind, rmdir, stat, unlink

    这些函数的功能和C语言中的同名函数类似.

 

    (2)chgrp, chmod, chown, copy

    这些函数的含义也都很容易理解:

chgrp(文件名,组);

chmod(文件名,模式);

chown(文件名,用户);

copy(源文件名,目标文件名);

    需要注意的是:这些函数用的是文件名而不是fopen返回的文件号.

 

    (3)file_exists, fileatime, filectime, filegroup, fileinode, filemtime, fileowner, filesize, filetype, fileperms, fileumask, is_dir, is_executable, is_file, is_link, is_readable, is_writeable

    这些是文件信息函数,大多接受一个文件名作为参数.

 

    (4)fgetss

    用法:

    fgetss(文件号,最大长度);

    读取文件的一行或直到最大长度(类似于fgets),但去掉所有的 HTML和PHP标记.

 

    (5)file

    用法:

    file(文件名);

    返回一个数组,每一个元素是文件中的一行.

 

    (6)tempnam

    用法:

    tempnam(目录名,前缀);

    返回一个临时文件名.

 

    (7)basename, dirname

    取得文件路径中的文件名部分和目录名部分. 在Windows系统下,"/"和""都可以作为目录分割符,其他系统下只有"/"可以.

目录遍历函数     

    PHP中的目录遍历功能本来也很普通,但它却具有一种"面向对象"的形式, 所以也提一下:

    (1)dir, opendir

    用法:

    $d = dir("目录名");

    $handle = opendir("目录名");

    前者返回一个目录对象,后者返回一个目录句柄. 前者返回的对象有handle和path两个属性,第一个就相当于opendir 返回的句柄,第二个就是目录名本身.访问时用$d->handle和$d->path.

 

    (2)read, readdir, rewind, rewinddir, close, closedir

    三组中每组的前一个是目录对象的方法,用"对象->方法()"调用, 后一个是函数,用"函数名(目录句柄)"调用. read是返回目录中的下一个文件名. rewind是回到目录的第一个文件名. close是关闭目录,不再遍历.

 

    (3)chdir

    转换PHP的工作目录.

时间函数

    PHP中的时间函数有这么些:

    (1)date

    用法:

    date(格式,[时间]);

    如果没有时间参数,则使用当前时间. 格式是一个字符串,其中以下字符有特殊意义:

U 替换成从一个起始时间(好象是1970年1月1日)以来的秒数Y 替换成4位的年号.

y 替换成2位的年号.

F 替换成月份的英文全称.

M 替换成月份的英文简称.

m 替换成月份数.

z 替换成从当年1月1日以来的天数.

d 替换成日数.

l 替换成星期几的英文全称.

D 替换成星期几的英文简称.

w 替换成星期几(数字).

H 替换成小时数(24小时制).

h 替换成小时数(12小时制).

i 替换成分钟数.

s 替换成秒数.

A 替换成"AM"或"PM".

a 替换成"am"或"pm".

S 替换成序数字后缀,例如:"st","nd","rd","th".

    函数返回作过了替换的格式串.

 

    (2)getdate(时间)

    返回一个哈希表,各下标是:

"seconds" -- 秒数

"minutes" -- 分数

"hours" -- 小时数

"mday" -- 日数

"mon" -- 月份数

"year" -- 年号

"yday" -- 1月1日以来的天数

"weekday" -- 星期几,英文全称

"month" -- 月份,英文全名

 

(3)gmdate

    与date类似,但先将时间转换成格林威治标准时.

 

    (4)mktime

用法:

mktime(小时数,分数,秒数,月,日,年); 返回一个时间值,可用于其他函数.

 

    (5)time

用法:

time(); 返回1970年1月1日零点以来的秒数.

 

(6)microtime

用法:

microtime(); 返回一个字符串,用空格分成两部分,后一部分相当于time()

的返回值,前一部分是微秒数.

    

    (7)checkdate

用法:

checkdate(月,日,年); 返回逻辑真或逻辑假. 如果:

年在1900和32767之间(包括1900与32767);
月在1到12之间;
日在该月的允许日数范围内(考虑了闰年);

则返回逻辑真.

 

    (8)set_time_limit

    用法:

set_time_limit(秒数);

规定从该句运行时起程序必须在指定秒数内运行结束, 超时则程序出错退出.

图象函数

    PHP中有一组图像函数,可以动态生成gif格式的图像数据流并输出到 服务器. 为了这组函数能够工作,系统中必须有gd库的支持.如果是在Unix下, 应该在编译PHP之前先取得gd的源码并编译之,生成libgd.a和一些.h文件,分别拷到系统的库目录和头文件目录中(例如/usr/lib和/usr/include);如果是在Windows下,PHP3.0的安装程序会安装一个gd.dll文件,在程序中加一句'dl("gd.dll");'即可使用图像函数.

    主要的图像函数有:

    (1)ImageCreate(宽度,高度)

    返回一个图像描述符.

 

    (2)ImageCreateFromGif(文件名);

    返回一个图像描述符.

 

    (3)ImageColorAllocate(图像描述符,红,绿,蓝);

    返回一个颜色描述符.由于Gif图像只能有256色,必须先对它分配调色板, 这个语句就是分配一个调色板项.

 

    (4)ImageColorTransparent(图像描述符,颜色描述符);

    指定某颜色为透明色.

 

    (5)ImageArc(图像描述符,圆心横坐标,圆心纵坐标,椭圆宽,椭圆高,起始角,终止角,颜色描述符);

    ImageChar(图像描述符,字体,x,y,字符,颜色描述符);

    ImageCharUp(图像描述符,字体,x,y,字符,颜色描述符);

    ImageCopyResized(目标图像描述符,源图像描述符,目标x,目标y,源x,源y,目标宽,目标高,源宽,源高);

    ImageDashedLine(图像描述符,x1,y1,x2,y2,颜色描述符);

    ImageFill(图像描述符,起始点x,起始点y,颜色描述符);

    ImageFilledPolygon(图像描述符,各顶点数组,顶点数,颜色描述符);

    ImageFilledRectangle(图像描述符,x1,y1,x2,y2,颜色描述符);

    ImageFillToBorder(图像描述符,起始点x,起始点y,边界色,填充色);

    ImageLine(图像描述符,x1,y1,x2,y2,颜色描述符);

    ImagePolygon(图像描述符,各顶点数组,顶点数,颜色描述符);

    ImageRectangle(图像描述符,x1,y1,x2,y2,颜色描述符);

    ImageSetPixel(图像描述符,x,y,颜色描述符);

    ImageString(图像描述符,字体,x,y,字符串,颜色描述符);

    ImageStringUp(图像描述符,字体,x,y,字符串,颜色描述符);

    这些都是画图函数,需要略做解释的就是多边形的顶点数组内依次存放着 第一点x,第一点y,第二点x,第二点y,...

 

    (6)ImageLoadFont(文件名);

    文件应该是一个位图字体文件,返回一个字体号.系统缺省带有1-5字体号, 可以直接使用.

 

    (7)ImageSX,ImageSY

    分别得到一个图像的宽度和高度,接收一个图像描述符参数.

 

    (8)ImageColorAt(图像描述符,x,y);

    ImageColorClosest(图像描述符,红,绿,蓝);

    ImageColorExact(图像描述符,红,绿,蓝);

    ImageColorSet(图像描述符,颜色描述符,红,绿,蓝);

    ImageColorsForIndex(图像描述符,颜色描述符);

    ImageColorsTotal(图像描述符);

    前三个返回一个颜色描述符.ImageColorExact如果找不到匹配则返回-1.

    ImageColorsForIndex返回一个三项的数组,元素分别是红,绿,蓝值.

    ImageColorsTotal返回总颜色数.

 

    (9)ImageFontHeight,ImageFontWidth

    接收一个字体号作为参数.

 

    (10)ImageGif(图像描述符,[文件名]);

    如无文件名,则将gif数据流送往浏览器.这时程序一开始应该有一句: Header("Content-type: image/gif")

 

    (11)ImageDestroy(图像描述符);

    图像函数中有一个小Bug(至少在PHP3.0RC和PHP3.0RC3 For Unix的源码中已经发现,现在www.php.net上的下载文件应该已经更改),就是ImageSetPixel总是在(y,y)处画点,不管x的值是什么,不过这个问题不是很大.

数据库函数(部分)

    PHP的数据库功能应该说是它最有用的功能之一.它的特点就是内置了对很多数据库的支持,而不再需要重新扩充.

    Perl和Tcl也都是常用的跨平台语言,都有很强的字符能力,前者字符能力更 强一些,性能更高一些;而后者有GUI能力.它们都可以扩充以支持数据库,但这时如果仍旧希望应用程序有跨平台能力,则需要在各种平台上各自扩充,比如在Unix平台上对Perl扩充DBI包,在Windows 95/NT下对Perl扩充Win32::ODBC包,有时候这是很麻烦的.而PHP由于内置了数据库支持,就为编程人员省去了这些麻烦.

    对各种数据库,访问函数并不完全相同,例如那些基于SQL的数据库显然不能用和dBase或dbm相同的方式访问.以下比较详细地介绍以下MiniSql和MySql数据库的访问函数:

 

    mSQL(mini SQL)是一种小型的关系数据库,性能不是太好,对SQL语言的支持也不够完全,但在一些网络数据库应用中是足够了.

    MySQL是mSQL的一个变种,性能有所提高,增加了用户访问控制. 这两种数据库都是通过SQL语言访问的,但MySQL基本支持全部SQL92规范, 只是"select ... where select .."不支持,另外还扩充了一些数据类型,而mSQL 则基本上不支持任何嵌套SQL语句,也不支持"update set column1=column1-1"这样的语句.

    mSQL由于较简单,在运行简单的SQL语句时速度比MySQL略快,而MySQL在 线程和索引上下了功夫,运行复杂的SQL语句时比mSQL,PostgreSQL,Oracle等都要快一些. 安全性方面,mSQL通过ACL文件设定各主机上各用户的访问权限,缺省是全部可读/写,而MySQL通过一个授权库设定用户名,口令和访问权限,较可靠一些mSQL的存储能力不是很清楚,MySQL的存储能力受文件系统限制,例如在Linux下不能超过2G(3G?记不清楚了).

    mSQL与MySQL既然本来就是差不多的两个东西,PHP中对它们的访问语句也都差不多,例如msql_close与mysql_close就分别完成同样的关闭动作.所以以下介绍时只对mysql介绍,msql的访问语句只需换个前缀即可(特殊情况另行说明).

 

    注意:mSQL与MySQL访问函数都需要有相应的权限才能运行.

    (1)mysql_connect(主机,用户名,口令);

    返回一个连接号.

    注意:mysql各用户的口令可以随该用户所在机器IP地址不同而改变.另外,mSQL没有用户名机制,所以msql_connect只需要一个主机参数. 主机可以是IP地址或域名.

 

    (2)mysql_create_db(数据库名);

 

    (3)mysql_select_db(数据库名,连接号);

    连接一个数据库.

 

    (4)mysql_query(SQL语句,连接号);

    如果SQL语句是select,则返回一个结果号.否则返回的值可以不理会.

    如果失败,返回false.

 

    (5)mysql_fetch_array(结果号);

    取出下一行,返回一个数组.可以用数字下标访问(第一个字段是下标 0),也可以用字符串下标访问(即使用各字段名). 如已取了最后一行,返回 false.

 

    (6)mysql_fetch_field(结果号,[字段序号]);

    如无字段序号,取下一个字段. 返回一个哈希表,下标有: name, table, max_length, not_null, primary_key, unique_key, multiple_key, numeric, blob, type, unsigned, zerofill 各下标的意思应该比较明白了.

 

    (7)mysql_num_rows(结果号);mysql_num_fields(结果号);

 

    (8)mysql_free_result(结果号);

 

    (9)mysql_list_dbs();mysql_list_tables(数据库名);

    

    (10)mysql_close(连接号);

 

    (11)mysql_pconnect(主机,用户名,口令);

    与mysql_connect完全相似,但建立一个"永久连接",该连接一经建立永不关闭,即使使用mysql_close函数或程序执行完毕也不关闭.下一次试图建立永久连接时,系统如发现已存在一个永久连接,则直接返回该连接号而不重新创建.
 

关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
BCVE视频特效课程
BCUI全链路UI设计
BCSP软件开发专业
BCNT网络工程师
启能职业教育基础课程
长沙初中生学什么
长沙高中生学什么
长沙大学生学什么