变量的作用域问题
变量的作用域,就是指:一个变量,在什么范围内可以使用的情况。
PHP中,有三个变量作用域:
局部作用域:
就是指一个函数的内部范围。
对应这样的变量,就称为局部变量
超全局作用域:
就是指所有代码的范围。
对应这里的变量,就称为超局部变量;
其实只有系统预定义的几个:$_GET,$_POST,$_REQUEST,$_GLOBALS,$_SESSION,
$_COOKIE,$_FILES
全局作用域:
就是不在函数内部的范围——函数外部。
对应这样的变量,就称为全局变量。
通常:
全局范围不能访问局部变量;
这里演示局部访问全局变量,会出错
$v1 = 1;
function f1(){
echo “<br /> 在函数内部访问外部:v1=$v1”;
}
局部范围不能访问全局变量;
f1();
这里演示全局变量访问局部变量,会出错
function f2(){
$v2 =1 ;
}
f2();
echo “<br />在函数外部访问局部变量 : v2=$v2”;
函数内部的变量(局部变量),通常在函数调用执行结束后,就被”销毁”;
但有一种局部变量,在函数调用结束后不被销毁,它叫“静态变量”
使用形式:
function 函数名(......){
static $变量名 = 初始值; // 这就是静态变量
}
示例:
如何在局部作用域使用(访问)全局变量(常见需求)
有两种做法:
做法一:
使用global关键字来实现
做法二:
使用$GLOBALS 超全局变量来实现:
但,如果我们对$GLOBALS变量的某个单元(也即下标)进行unset,则其就会完全对应销毁改变量。
这是因为:$GLOBALS对全局变量的使用可以看作是全局变量的另一种语法形式而已,而不是“引用关系”,举例如下:
有关函数的系统函数
function——exits();判断一个函数是否被定义过,其中使用的参数为”函数名”;
func_get_arg();
func_get_args();
func_num_args();
有关函数的编程思想
递归函数就是在一个函数内部调用他自己的函数。
递归思想——递归函数
function f1($n){
echo $n;
$n++;
f1($n);
}
f1(1);
从这个简单的函数可以看出,该函数调用是无限的,非正常做法!
实用的递归函数是:能够控制这个调用的过程中,会在某个时刻停下来
求n的阶乘
function f1($n){
if($n == 1){
return 1;} //跳出条件
Sv1 = $n*f($n-1);
Echo “ <br />$v1”;
return $v1;
}
地柜思想总结:
当面对一个大问题是,改大问题可以经由该问题的同类问题的小一级问题,而进过简单计算获得,而且,可以获知(已知)这类问题的“最小一级问题”的答案。则,此时就可以用递归方法解决该问题。
Function 函数名($n){
If(是最小一级){
return 值 ;
}
$一个变量 = 对 函数名($n-1)进行运算;
Return $一个变量;
}
递推(迭代)思想
如果要求一个大问题,且该问题有如下连个特点:
1.一直待问题的同类问题的最小问题答案。
2.如果知道这种问题的小一级问题的答案,就可以轻松求得其大一级问题的答案,并且此问题的级次有一定的规律:
则此时就可以使用递推思想来解决问题,代码模式为:
$变量一 =已知最小一级的答案;
For($i=最小一级的下一级;$i <=最大一级的级次;++$i){
$变量二 = 对$变量一进行一定的计算,通常需要使用到$i;
$变量一=$变量二;
}
Echo “结果为:” . $变量二; |
|