在每种语言中,变量定义后都有一个作用域,当然PHP中,变量也都有一个作用域,今天要学习的就是PHP的变量作用域。
<?php$a = 1; include 'var_scope1_inc.php'; var_scope1_inc.php的代码
<?phpecho $a; 脚本var_scope1.php的执行结果如下:
1 1 可以看到$a在inc文件中也是有效的。 var_scope1.php的代码
<?php$a = 1; include 'var_scope1_inc.php'; function testFuncP() { echo "inside function testFuncP: a=$a" . PHP_EOL;} testFunc();testFuncP(); var_scope1_inc.php的代码
<?phpecho "inside global scope: a=$a" . PHP_EOL; function testFunc() { echo "inside function testFunc: a=$a" . PHP_EOL;} 脚本var_scope1.php的执行结果如下:
123 inside global scope: a=1inside function testFunc: a=inside function testFuncP: a= 结果里,testFunc与testFuncP中的a的值都为空,因为这个时候打印$a变量的值时打印的函数本地域的值,但是函数中没有定义$a变量,因此打印出来都为空值。这个与C里面的全局变量不太一样,在C中,在函数内部如果没有定义与全局变量同名的局部变量,那么在函数中全局变量将被使用。 var_scope2.php的代码
<?php$a = 1;$b = 2; function nonGlobalFunc() { echo "Inside noGlobalFunc: a=$a, b=$b" . PHP_EOL;} function useGlobalFunc() { global $a, $b; echo "Inside useGlobalFunc: a=$a, b=$b" . PHP_EOL; $b = $a + $b;} nonGlobalFunc();useGlobalFunc();echo "Result: a=$a, b=$b" . PHP_EOL; 脚本执行的结果如下:
123 Inside noGlobalFunc: a=, b=Inside useGlobalFunc: a=1, b=2Result: a=1, b=3 另外,在函数之外使用global关键字不会出错。如下例: global_keyword_inc.php的代码
<?phpglobal $a, $b; $b = $a + $b; global_keyword.php的代码
<!--?php <br ?-->$a = 1;$b = 2; function incGlbalFunc() { include_once 'global_keyword_inc.php';} incGlbalFunc(); echo "Result: a=$a, b=$b"; 脚本global_keyword.php的执行的结果如下:
1 Result: a=1, b=3 上例中,global_keyword.php中incGlobalFunc函数包含了global_keyword_inc.php,在后者中变量$a和$b的声明使用了global关键字。 global_keyword.php的代码
<?phpfunction test_global_ref() { global $obj; $obj = &new stdclass;} function test_global_noref() { global $obj; $obj = new stdclass;} test_global_ref();var_dump($obj);test_global_noref();var_dump($obj); 脚本执行的结果如下:
123 NULLobject(stdClass)#1 (0) {} test_global_ref中,将$obj的引用改变了,根据我的另外一篇博客 PHP研究之引用计数器(Reference Counting)的说明,此时$obj指向了另外一个ZVal容器了,与刚开始的全局变量指向的不是一个Zval容器,因此,返回的结果是NULL,而第二个因为函数的$obj与全局变量$obj指向指向的是同一个Zval容器,在函数内更改的只是ZVal的值,因此函数的更改反映到了全局变量中。 例:
<?phpfunction test() { $foo = "local variable"; echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n"; echo '$foo in current scope: ' . $foo . "\n";} $foo = "Example content";test(); 上面脚本的执行结果如下:
$foo in global scope: Example content$foo in current scope: local variable |