四、 简便方法
前面的常规表达式怎么样?很有意思,是吧?要是在每个需要检查email地址的程序里都写上这么一段程序,那才真叫有意思呢?!想想看吧,得写那么乱七八糟的一段程序,还得写上那么多遍!...不过,当然了,还有更简便的方法。
还记得前面? 学过的头文件吗?它能让我们写一段程序,象是这个email地址的检查程序,然后把这段程序包含进多个程序里面去。这样,我们要改写这段程序时,只须改动一处就行了,不用修改多个文件。
但是,要做到这一点,我们必须用到函数。
我们已经用过很多次函数了。每次我们查询数据库或检查字符串长度时,我们都是用函数来做的。这些函数是PHP自带的。假如您是位热心的程序员,您可以用自己编写的函数来扩充PHP本身的功能。但对本教程而言,这部分内容是太过高深了一点。我们要创建的函数不是那一种,而是写在PHP脚本程序内部的函数。
函数就是一段程序代码,我们可以把一个或多个值传给这段代码,然后这段代码会处理我们传给它的数据并返回一个值。根据实际需要,函数可以很简单,也可以十分复杂。但是只要我们传进去一个数,然后能得到一个数,您管它里面有是复杂还是简单呢!这就是函数的可爱之处。
PHP里的函数与C语言里的函数表现差不多。当我们定义函数时,必须指明函数需要接收什么样的数据。一开始好象不太好理解为什么它要接收数据进去,不过这样可以防止发生一些怪异的问题。函数之所以能做到这一点,是因为函数里面的变量都是私有变量,也就是说,它只在该函数内部存在。例如,您在程序中有一个变量叫$myname,假如您创建了一个函数,想让这个函数也使用那个$myname变量(值也相同),那是不行的。您可以在函数内部创建一个变量,名字也叫$myname,这两个变量可以各平相处,而各自取不同的值。不过我可不建议您这么做!您假如真的这么做了,等半年后您再来修改这样的程序时,您可能就会被弄糊涂了。
那我们现在就来创建一个函数,先来个简单的。我们要给它取个名字,指定它要接收什么的变量。在调用这个函数之前,我们还得定义这个函数。
$#@60;body$#@62;
$#@60;?php
function addnum($first, $second) {
$newnum = $first $second;
return $newnum;
}
echo addnum(4,5);
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
这就行了!首先,我们创建了第一个自己的函数。我们定义了两个新变量,$first和$second,注重它们是怎样被定义的。在调用这个函数时,要给这两个变量按它们出现的顺序赋好值 - 4赋给$first,5赋给$second。然后我们简单地把这两个数加在一起,返回结果。“返回”在这里的意思是把结果送回去。在程序最后部分我们把数字9显示出来。
我们再来创建一个函数,让它对我们的数据库应用有点帮助。一个能妥善处理错误的函数怎么样?试试下面的程序:
$#@60;body$#@62;
$#@60;?php
function do_error($error) {
echo "噢,好象有点儿问题...$#@60;br$#@62;";
echo "系统报告的错误是:$error.\n$#@60;br$#@62;";
echo "最好是暂时关闭网站并通知系统治理员。";
die;
}
if (!$db = @MySQL_connect("localhost","user", "password")) {
$db_error = "无法连接到MySQL数据库";
do_error($db_error);
}
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
在运行程序之前,试试关闭MySQL数据库,或使用错误的用户名或口令。您会看到友好的、有用的错误信息 。细心的朋友会注重到在mysql_connect()函数之前的那个@符号。它会抑制系统错误信息,使得程序只能从do_error()函数那里得到有关的错误信息。您还会注重到,我们可以把一个在别处定义的变量作为参数传给函数,而不是在调用时直接赋一个值。
还记得我过函数使用的是私有变量吧?这话说得不完全对。事实上,您可以让函数访问到函数外面的变量。您可能要写一个函数,用它来查询数据库,然后把结果显示在多个网页中。您不想每次都把数据库连接标识都传给函数。在这种情况下,您可以把连接标识定义成一个全局的变量。例如:
$#@60;body$#@62;
$#@60;?php
function db_query($sql) {
global $db;
$result = mysql_query($sql,$db);
return $result;
}
$sql = "SELECT * FROM mytable";
$result = db_query($sql);
?$#@62;
$#@60;/body$#@62;
$#@60;/html$#@62;
这是个很简单的函数,但重要的是,您在调用这个函数时,不必传递$db变量 - 您可以通过 global这个字使得函数可以访问到该变量。在这条语句中您可以定义多个全局变量,各个全局变量之间用逗号隔开。
最后,您可以使用可选参数,这样看起来您已经是真正的专家了。这里面要害的一点是,在函数中定义参数时要给它指定一个缺省值。然后您在调用这个函数时,假如不为该参数变量指定其他值,那么函数会自动把缺省值赋给这个变量。假如您指定了其他值,那么缺省值就不起作用了。
不太明白?比方说,您在连接数据库时,几乎总是连接到相同的服务器,并且使用相同的用户名和口令。不过有时候,您也需要连接到其他的服务器。看看下面的程序:
$#@60;body$#@62;
$#@60;?php
function db_connect($host = "localhost", $user="username", $pass="graeme") {
