中文
从HTML中脱离
这儿有三种方法从HTML中脱离,同时加入“PHP代码模式”
Example 5-1. 从HTML中脱离的方法
1. echo("this is the simplest, an SGML processing instruction\n"); ?>
2.
3. ;
4.
语句的脱离方法
语句的脱离方法和C及PERL是一样的------终止每一个语句时使用分号(;)。
结束标签(?>)也暗示了说明的结束,所以下面的两句话是等价的:
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
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 (简单的表单变量)
当提交之后,PHP将建立一个变量“$name”,它将包含任何在表单中输入在“Name”中的内容。
PHP同时也知道如何安排表单变量的上下文关系,但是仅仅限于一次。您可以,例如,将一组变量同时叙述,或者使用这个特性来重新从多重选择输入中获得值:
Example 5-3. More complex form variables
如果PHP的track_var特性被打开了,任何关于它的结构设置或者指示,然后经由POST或GET模式的变量提交将发觉使用全局联合数组“$HTTP_POST_VARS”和“$HTTP_GET_VARS”是合适的。
图形提交变量名字
当提交一个表单时,有可能使用一幅图象来代替标准的带标签的提交按钮,例如:
当用户点击该图象的任何位置时,相应的表单将被使用两个附加的变量(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()。