开发者社区> 飞鸿影~> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PHP变量作用域

简介:
+关注继续查看

PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖,这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须声明为 global。
PHP: 变量范围 - Manual

全局变量

在函数范围之外所声明的变量就是全局变量。由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,因此在函数中并无法直接调用使用全局变量。

局部变量

在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过return指令,来将其传回至主程序区块以作后续处理。

函数内使用全局变量

1、通过传参方式将变量传入函数内部使用函数内部不能改变全局变量的值
可以在传参数时形参使用&符号与外部全局变量建立引用关系,这样可以更改全局变量的值。

$a=10;
function canshu($x){
    echo $x;
}

canshu($a);//输出10

2、通过global关键字声明一个与全局变量同名的局部变量需先声明后使用(实质上是建立了引用关系)此时在函数里面可以修改全局变量的值;unset后引用关系没有了,但外部全局变量依旧存在。

$a=10;

function quanju(){
    global $a;
    echo $a;
    unset($a);//unset后引用关系没有了,但外部全局变量依旧存在
    var_dump($a);//null
}

quanju();//输出10
echo '<br/>out:';
echo $a;//输出10

3、使用超全局数组GLOBALS
此时在函数里面可以修改全局变量的值;
unset后外部全局变量也不存在了。

$name='Bob';//全局变量$name也属于超全局数组GLOBALS的成员之一
echo '<pre>';
// print_r($GLOBALS);
echo '</pre>';

echo $GLOBALS['name'];


function chao(){
    echo $GLOBALS['name'];
    $GLOBALS['name']='Allen';//将改变外部全局变量$name的值
    unset($GLOBALS['name']);//将unset外部全局变量$name的值
}
echo '<br/>in:';
chao();//Bob

echo '<br/>out:';
var_dump($name);//null

静态变量(static)

PHP支持声明函数变量为静态的(static)。

一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。

要声明函数变量为静态的用关键字static。通常,静态变量的第一次使用时赋予一个初始值。

函数内使用静态变量关键字static声明的变量在执行完函数后不会被释放,下一次函数调用仍然生效。

function add(){
    static $a=0;
    echo $a;
    $a++;
}

add();//0
echo "<hr/>";
add();//1
echo "<hr/>";
add();//2

UPDATE
2016-1-9 16:54:19

Javascript语言函数内部可以直接读取全局变量。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
!!的作用
<div class="markdown_views"> <p>!!是一个很简单的方式,让任意JavaScript表达式变成Boolean的方式, 例如:!!“hello” === true and !!0 === false <br> 参考: <a href="http://yannhe.com/jsninja">忍者禁术</a></p> <pre class="prett
729 0
PHP 判断常量,变量和函数是否存在
 如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
411 0
函数声明提升与变量提升
1.当在函数的作用域里定义一个和外部变量一样的名称的变量时,变量声明会提升至第一句,但是赋值则不变 var test="hello world"; function(){ alert(test); var test="hello world a...
398 0
Go值类型和引用类型+作用域+空白标识符+常量
值类型和引用类型 所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值
0 0
函数的作用
函数的作用
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载