PHP4新增的部份语法
作者 : 林义祥
目前使用PHP的人已经相当的多,而PHP也被大家广泛的讨论与应用,相信PHP必定会成为新一代的潮流。从之前我所学习的PHP3,发展到现在的PHP4,PHP4的速度不但加快了许多,而且也增加了蛮多的函数库,功能真是愈来愈多啊!以下是我在看手册时的新发现,至少是在别的站上所未曾见过的,而且书上也没提到的,因此翻译其中的部份内容来和各位同好们一起分享,也希望大家来信指教。以下的文章及范例皆取自PHP官方网站。
在 PHP4中,新增了一个回圈 foreach,它很像是 perl和其它的语言,你可以给它一个数组,让它来取出数组的值。它有下列这二个语法,第二个语法是较次要的,但是可用来作为第一个语法的延伸。
foreach(array_expression as $value) statement
foreach(array_expression as $key => $value) statement
第一个形式的回圈,它会在每个回圈上,将目前元素的值分配给 $value,并且向后移动数组的内部指标,所以在下一个回圈的时候,你就会看到下一个元素了。
第二个形式的回圈和第一个是相同的,不同的是它会在每个回圈将目前元素的索引值分配给变量 $key。
注意 : 当 foreach第一次开始执行的时候,它会把数组的内部指标重新设定到数组的第一个元素,意思是说,在使用 foreach之前,你不必再去呼叫 reset( )。
注意 : foreach是运作在数组的复制,而不是数组它本身,因此并不会改变量组指标
下面范例的功能都是相同的 :
<?php
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>\n";
}
foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
?>
下面范例的功能也都是相同的 :
<?php
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Key: $key; Value: $value<br>\n";
}
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br>\n";
}
?>
以下的范例将说明 foreach的用法 :
<?php
/* foreach example 1: value only */
$a = array (1, 2, 3, 17);
foreach ($a as $v) {
print "Current value of \$a: $v.\n";
}
/* foreach example 2: value (with key printed for illustration) */
$a = array (1, 2, 3, 17);
$i = 0;
/* for illustrative purposes only */
foreach($a as $v) {
print "\$a[$i] => $k.\n";
}
/* foreach example 3: key and value */
$a = array (
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach($a as $k => $v) {
print "\$a[$k] => $v.\n";
}
?>
require_once( )以指定的文件来取代它自己本身,这很像是C语言中的#include,而且和 require( )也很相似,最大的不同是require_once( )有个包含链(inclusion chain),require_once( )的使用将会保证文件加入你的程式中只有一次,而且会避开与变量值或函数名称之间的冲突。
为了要测试这个范例,请你建立二个文件 utils.inc和 foolib.inc
文件 utils.inc的内容 :
<?php
define(PHPVERSION, floor(phpversion()));
echo "GLOBALS ARE NICE\n";
function goodTea() {
return "Oolong tea tastes good!";
}
?>
文件 foolib.inc的内容 :
<?php
require ("utils.inc");
function showVar($var) {
if (PHPVERSION == 4) {
print_r($var);
} else {
dump_var($var);
}
}
// bunch of other functions ...
?>
然后建立一个档名为cause_error_require.php的文件,这个文件的内容为 :
<?php
require("foolib.inc");
/* the following will generate an error */
require("utils.inc");
$foo = array("1",array("complex","quaternion"));
echo "this is requiring utils.inc again which is also\n";
echo "required in foolib.inc\n";
echo "Running goodTea: ".goodTea()."\n";
echo "Printing foo: \n"; showVar($foo);
?>
然后当你试着去执行 cause_error_require.php的时候,输出的结果会是 :
GLOBALS ARE NICE GLOBALS ARE NICE
Fatal error: Cannot redeclare causeerror( ) in utils.inc on line 5
现在我们来修改 foolib.inc和 cause_error_require.php这二个文件,我们来使用 require_once( )来代替 require( ),并且将 cause_error_require.php这个文件重新命名为avoid_cause_error_require_once.php。
文件 foolib.inc修改的内容如下 :
...
require_once("utils.inc");
function showVar($var) {
...
文件 avoid_cause_error_require_once.php修改完成后的部份内容如下 :
...
require_once("foolib.inc");
require_once("utils.inc");
$foo = array("1",array("complex","quaternion"));
...
然后我们再执行 avoid_cause_error_require_once.php时,输出的结果会是 :
GLOBALS ARE NICE
this is requiring globals.inc again which is also
required in foolib.inc
Running goodTea: Oolong tea tastes good!
Printing foo:
Array
(
[0] => 1
[1] => Array (
[0] => complex
[1] => quaternion
)
)
include_once( )在程式执行的期间,将指定的文件给包含进来,这和 include( )很相似,而它们最大的不同处是,如果从文件包含进来的程式码先前已经有包含过的时候,include_once( )就不会再把它包含进来。
如果要在程式的执行期间包含相同的文件一次以上,而且又要确定文件有被包含进来时,便可以使用include_once( )。