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( )。