本文共 3927 字,大约阅读时间需要 13 分钟。
手册目錄: 語言參考---變量---變量范圍
參考詳情: https://secure.php.net/manual/zh/language.variables.scope.php
評論部分:
1. by warhog@warhog.net
提到在類函數中使用static變量的有趣代碼示例:
public function func_having_static_var($x = NULL) {
static $var = 0;
if ($x === NULL) {
return $var;
}
$var = $x;
}
<$a = new SampleClass(); $b = new SampleClass();
echo $a->func_having_static_var() . "\n";
echo $b->func_having_static_var() . "\n";
//輸出:
// 0
// 0
$a->func_having_static_var(3);
echo $a->func_having_static_var() . "\n";
echo $b->func_having_static_var() . "\n";
// 期望的輸出應該是3,但實際輸出卻是3和3,這表明static變量在方法內作用於整個類和所有實例,而非單一實例。
提示: 放棄在方法內使用static變量,改用函式變量如:function func($x = NULL) {
$this->var = $x;
}
2. by dodothedreamer@gmail.com
指出PHP中塊外訪問變量的特性,例如:if ($j == 1) $a = 4;
echo $a; // 輸出4
3. by Stephen Dewey
提到嵌套函數中的global指紋問題:function b() {
global $var1;
echo $var1;
// 若global $var1不在全局範圍內,將會引發錯誤
}$a('hello');
如果在函數上添加global $var1;並設置$var1 = 'some',將會成功
4. by emartin@sigb.net
提供了一種方法,來處理包含的全局變量:function some_function() {
global $func_variable_names;
// 定義並包含其他文件require_once 'anothertest_include.php';
$created_vars = array_diff_key(get_defined_vars(), $GLOBALS, $func_variable_names, $before_eval_vars);
foreach ($created_vars as $var_name => $value) {
global $$var_name; extract($created_vars); 5. by danno@wpi.edu
提供了一個與引用相关的有趣示例,並解釋了PHP中引用和賦值的區別:class Obj {
public function __destruct() {
echo 'destruct';
}function foo() {global $testvar;
$localvar = new Obj();
$testvar = &$localvar;
}
foo();
var_dump($testvar);
// 輸出: destruct 和 NULL
如果修改為:function foo() {
global $testvar;
$localvar = new Obj();
$testvar = $localvar;
}
此時 $testvar 將指向實例,並在程序結束時才解除引用
6. by jinxidoru@byu.net
提到static變量在類方法中不支持繼承,例如:function Z() {
static $count = 0;
printf("%s: %d\n", get_class($this), ++$count);
}
class B extends A {
public function Z() {
static $count = 0;
printf("%s: %d\n", get_class($this), ++$count);
}
測試將會顯示A和B各自的static變量
7. by moraesdno@gmail.com
指出使用GLOBALS數組比global關鍵字更快
8. Anonymous
提到使用static數組時返回元素的注意事項,例如:return $int++;
function return_copyof_scalar() {
static $v;
if (!$v) $v = 1;
return $v;
}
function return_copyof_arrayelement() {
static $v;
if (!$v) {
$v = array();
$v[0] = 1;
}
return $v[0];
}
9. by info@SyPlex.net
提供了一種將static變量在多個函數中訪問的方法,例如:static $staticVar;
return $staticVar;
function fooCount() {
$ref2static = &$staticVar;
echo $ref2static ++;
}
10. by Jack@soinsincere.com
指出方法內的static變量不能與參數引用結合,但可以使用數組保存參數引用static $my;
if (!$arr) return $my[0];
$my = $arr;
}
11. by ppo@beeznest.net
提供了一個示例,展示包含返回值後變量的訪問范圍$foo = 'aaa'; $bar = include('include.php');
$include.php 中:$foo = 'bbb'; return $foo;
// 期望輸出: aaa/bbb,實際輸出: bbb/bbb
12. by mod
展示class __destruct()方法中的變量置空順序,例如:function __destruct() {
global $g_Obj;
echo "#step 2: "; var_dump($g_Obj);
}
function start() {
global $g_Obj;
echo "#step 1: "; var_dump($g_Obj);
}
$g_Obj = new A(); $g_Obj->start();
13. by huntsbox@pacbell.net
提到嵌套函數中的重復聲明和第一次聲明的重要性,例如:static $first_time = true;
if ($first_time) {
functionsquare($x) {
return $x * $x;
}
$first_time = false;
}
返回 sqrt(square(4) + square(5));
// 輸出正確的平方和平方根值
14. by tomek@pluton.pl
指出static變量可用于數組初始化,但不支持表達式static $var = (some_function('arg'));
static $var = array(1, 'a', 3);
static $var = 2 + 3; // 正確
static $var = new object; // 錫誤
15. by jochen_burkhard@web.de
提到遠程文件中的變量在遠程調用時不可用,建議自行測試$paramVal = 10;
localfile.php 中:echo "remote-value=$paramVal";
// 可能不會得到預期值
本人水平有限,如有錯誤,請及時指正並改正
转载地址:http://fvtfk.baihongyu.com/