php自定义函数之变量作用域

我们通过前面的章节函数定义部份的学习我们知道了几个不同的规矩:

函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系。仅仅是在函数内部执行

函数内声明的变量也与函数外的变量没关系。

但是,我们实际的处理情况中会遇到这样的一个情况:

我想在函数体内定义的变量在函数体外用

我想把函数体外的变量拿到函数体内来使用

这个时候我们就需要用到超全局变量。我们来回顾一下之前的知识点:

全局变量名功能说明
$_COOKIE得到会话控制中cookie传值
$_SESSION得到会话控制中session的值
$_FILES得到文件上传的结果
$_GET得到get传值的结果
$_POST得到post传值的结果
$_REQUEST即能得到get的传值结果,也能得到Post传值的结果

我们来通过实验来观察 一下外部变量(超全局变量)的特点,打破本章开头我们总结的规律:

我们定义一下global.html页现来写HTML内容:

<html>
   <head>
       <title>超全局数组实验</title>
   </head>
   <body>
       <!--先用POST来实验,以后你可以改成GET哟 -->
       <form action="glob.php" method="post">
           <input type="text" name="hongniu" /><br />

           <input type="submit" value="提交" />
       </form>

   </body>
</html>

我们将html的内容通过form表单提交给了glob.php页面,我们现在来写glob.php:

<?php 
function demo(){ 
echo $_POST['hongniu']; 
} 
demo(); 
?>

通过这个小例子,你会发现超全局的$_POST等这一系列的超全局变量(外部变量)在函数内部也是可以用的。没有本文开始处变量作用域的限制。其实我们所有声明的变量都放到了$GLOBALS这个数组下面,举个例子:

<?php
$hello = 10;

echo $GLOBALS['hello'].'<br />';

$GLOBALS['hello'] = '我爱你';

echo $hello;

?>

通过上例,你会发现$变量名是等价于$GLOBALS['变量名'] 。所有的变量都放到了$GLOBALS里面了。而$GLOBALS也是全局的。

因此,我们能够来达到我们的目的:将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。

1.通过$GLOBLAS来读取外部变量

<?php

$one = 10;

function demo(){
   $two = 100;

   $result = $two + $GLOBALS['one'];

   return $result;

}
//你会发现结果变成了110
echo demo();

?>

上例中:我们将函数体外的变量通过$GLOBALS拿到了函数体使用。所以,打破了函数外的变量不能在函数体内使用的限定。

2.通过$GLOBLAS,在函数内修改外部变量

<?php

$hongniu = '我是一个兵,来自老百姓';

function test(){

   echo '执行了函数test哟<br />';
   //调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉

   $GLOBALS['hongniu'] = '帮助别人很快乐';
}

test();
//发现是不是输出的值变了呀?
echo $hongniu;

?>

通过上例:我们发现通过$GLOBALS['hongniu'],把$hongniu的值改变掉,所以在最后输出$hongniu的时候,值发生了变化。

3.通过$GLOBLAS,在函数内创建全局变量

<?php

function hello(){

   $GLOBALS['que'] = '提神喝茶更好哟';

   echo '你调了一下函数hello<br />';
}

hello();

echo $que;

?>

上例中,我们发现$que是不存在的,可以调用函数hello()后,在函数外部可以执行echo $que了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过$GLOBALS声明一个变量,也能够显示出来。

下面的知识是【了解】级别,我们越来越少的使用这种方式来声明全局变量了。在函数内使用global关键词后面跟一个或多个变量,就把变量变为了全局变量,格式如下:

global $变量1[,变量2,....变量n]

在global后面可以跟一个或者多个变量,变量用逗号分开。

<?php
$a = 10;
$b = 100;
function test(){
   global $a , $b;
   echo $a + $b;
}
//结果是不是显示出来了?
test();
?>

上例中,你还可以试试在global关键词后面跟着未创建的变量,在函数体内定义变量值,修改变量的值试试。其实与$GLOBALS一样,只是用法不同而已。

注意:
不可在global 后写 $变量 = 值。


global
读音:[ˈgləʊbl]
解释:全局的,全球的

继续学习
||
<?php function hello(){ $GLOBALS['que'] = '提神喝茶更好哟'; echo '你调了一下函数hello<br />'; } hello(); echo $que; ?>
提交重置代码
章节
笔记
提问
课件
反馈
捐赠

php入门教程之一周学会PHP

高并发千万级数据库系统解决方案
  • 推荐课程
  • 评论
  • 问答
  • 笔记
  • 课件下载

phpcn_u262

<?php $hello = 10; echo $GLOBALS['hello'].'<br />'; $GLOBALS['hello'] = '我爱你'; echo $hello; ?> 教程里不是按照这个应该会输出“10我爱你”的吗?为什么右边栏只显示了10?

7年前    添加回复 4

王统帅

这位兄弟请问你知道了吗,知道的话艾特我

王统帅 · 2018-09-16 18:16
无名

回答王统帅:这个网站编辑器的问题,其实下面有人说了的,我在本地测试后成功了,不知道怎么艾特你

无名 · 2018-12-10 15:32

DevilKing

<?php $one = 10; function demo(){ $two = 100; $result = $two + $GLOBALS['one']; return $result; } //你会发现结果变成了110 echo demo(); ?> 输出还是100 是什么鬼

6年前    添加回复 2

无名

要在本地测试才行,不能在这个网页这里试

无名 · 2018-12-10 15:41

ID是两颗心去旅行

编辑器有毒,注意本地操作!!!

6年前    添加回复 1

ID是两颗心去旅行

编辑器有毒,注意本地操作!!!

6年前    添加回复 1

phpcn_u2966

<?php function hello(){ $GLOBALS['que'] = '提神喝茶更好哟'; echo '你调了一下函数hello<br />'; } hello(); echo $que; ?> 这边应该会显示“提神喝茶更好哟”!!

6年前    添加回复 1

P粉106587565

编辑器有毒,需本地操作

1年前    添加回复 0

旧歌

编辑器有bug,显示不出$GLOBALS['hello'

4年前    添加回复 0

CL

这一章说的$GLOBALS['变量名'] 就等价于$变量名有点问题,应该是和php版本有关,自己有五点几的版本跑出来以下程序: <?php $one = 10; function demo(){ $two = 100; $result = $two + $GLOBALS['one']; return $result; } //你会发现结果变成了110 echo demo()

5年前    添加回复 0

vec

需要放在本地操作才能看到真正效果哦

5年前    添加回复 0

JasperD

什么情况? 编译器有问题?

5年前    添加回复 0

凯栋

这一节讲的不对吧

5年前    添加回复 0

二三

在函数内使用global关键词后面跟一个或多个变量,就把变量变为了全局变量,格式如下: global $变量1[,变量2,....变量n]

5年前    添加回复 0

phpcn_u89932

原来有这么多同学啊~

6年前    添加回复 0

网页编辑器 有些操作不能执行

6年前    添加回复 0

黄嘉豪

全局作用域下的$才等于$GLOABLS,局部作用域不等于

6年前    添加回复 0

这一章节的例子有点问题

[最新 我心飞翔 的回答] 是不是使用了网页上的编辑器?这个编辑器有问题,但是我不知道这个页面禁用了什么。可以在本地尝试示例代码,本地输出是成功的!

时间:4年前

浏览器显示出来的字符都是框框七七八八的乱的东西

[最新 (O_O) 的回答] 设置一下你的浏览器为utf-8,或者在php代码

时间:4年前

没变啊?

[最新 达芬奇的烦恼 的回答] 代码编辑器的问题,在自己电脑上php运行就没问题了。

时间:4年前

将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。

[最新 cherry 的回答] http://www.php.cn/code/1096.html 你看看这里,$GLOBALS的使用问题,是不是php版本问题

时间:5年前

全局变量在网页使用存在问题,望及时修复。

[最新 Gakki 的回答] PHP学习交流群:*

时间:6年前

这里面的例子确定都没问题吗?

[最新 猪哥 的回答] 不需要

时间:6年前

函数内部无法使用$GLOBLAS改变外部变量呀!!

[最新 phpcn_u10728 的回答] 他们服务器有问题了吧,表示在本地服务器上运行结果是正确的啊

时间:6年前

课件暂不提供下载,工作人员正在整理中,后期请多关注该课程~