php全局变量的使用

一、总结

1、php的全局变量:php的全局变量和C++,Java的全局变量不一样

2、页面嵌套php:我在html页面中嵌套php代码的时候,php的全局变量好像和C++,Java的全局变量一样,好像是,记不清了

3、php全局变量使用php全局变量用global定义一下就好,就在外面定义global是错的,必须在函数内声明

4、global定义全局变量:global定义全局变量的时候,不能一起赋值,像global $name = "why"的使用方式是错误的

5、global使用(函数外声明global是错的):下面实例中还是在函数里面声明global然后才能用

二、PHP 全局变量

一直认为PHP的全局变量与C++、Java全局变量类似,直到最近做项目过程中使用的局变量,才发现需要补充学习下这方面的内容。

1、全局变量的global的定义和使用

  最初,我的需求是这样的:
<?php
$name = "why";
function changeName(){
$name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  执行代码的结果是:my name is why,而不是执行changeName()后显示what。分析原因,这是因为函数体changeName内$name变量被缺省设置为局部变量,$name的作用域就是在changeName内。于是,修改代码,添加全局变量如下:

<?php
global $name;
$name = "why";
function changeName(){
$name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  注意:不能在用global声明变量的同时给变量赋值。像global $name = "why"的使用方式是错误的。

  定义全局变量后执行的结果仍然为my name is why,这个结果让我吃惊。原来,global的正确用法是:"在一个函数中引入外部的一个变量,如果该变量没有通过参数传递进来,那么就通过global引入进来。" 也就是说,当一个函数引用一个外部变量时,可以在函数内通过global来声明该变量,这样该变量就可以在函数中使用了(相当于当作参数传递进来)。那么,再次修改代码:

<?php
$name = "why";
function changeName(){
global $name;
$name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  这次的运行结果是:my name is what,说明global是起传递参数的作用,而并非使变量的作用域为全局。再看下面的例子:

<?php
$name = "why";
function changeName(){
global $name;
$name = "what";
}
function changeName2(){
$name = "where";
}
changeName();
changeName2();
echo "my name is " . $name . "<br/>";
?>

  执行结果为:my name is what,如果在changeName2()中添加global $name,运行结果则是:my name is where。

  综上,global的作用就相当于传递参数,在函数外部声明的变量,如果在函数内想要使用,就用global来声明该变量,这样就相当于把该变量传递进来了,就可以引用该变量了。

  除了使用global参数定义外,还可以使用超全局变量$GLOBAL:

<?php
$name = "why";
function changeName(){
$GLOBALS['name'] = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

2、global和$GLOBAL

一个例子:

<?php
$var1 = 1;
$var2 = 2;
function test1(){
$GLOBALS['var2'] = &$GLOBALS['var1'];
}
test1();
echo $var2 . "<br />"; $var3 = 1;
$var4 = 2;
function test2(){
global $var3,$var4;
$var4 = &$var3;
}
test2();
echo $var4 . "<br />";
?>

  输出$var2的值为1,$var4的值为2,因为$var3的引用指向了$var4的引用地址。$var4的实际值并没有改变。官方的解释是:$GLOBALS['var']是外部的全局变量本身,global $var是外部$var的同名引用或者指针。意味着$GLOBAL在一个脚本的全部作用域中都可用,在函数或方法中无需执行global $variable; 就可以访问它们。与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。另一个例子:

<?php
$var1 = 1;
function test1(){
unset($GLOBALS['var1']);
}
test1();
echo $var1 . "<br />"; $var2 = 1;
function test2(){
global $var2;
unset($var2);
}
test2();
echo $var2;
?>

  输出结果是$var1不存在,而$var2的值为1。这就证明,$var2只是别名引用,本身的值没有受到任何的改变。也就是说global $var其实就是$var = &$GLOBALS['var'],调用外部变量的一个别名而已!

参考:

PHP 全局变量 - borage - 博客园
https://www.cnblogs.com/borage/p/3645285.html

三、实例(php实现排列组合)

 <?php
namespace app\index\controller; use app\index\controller\Base; class Exercise extends Base
{
public function index()
{
// return view('insert_array');
$this->plzhDemo();
} /**
* php实现排列组合
* 参数:传入数组 排列组合所取的位数 vis数组 ans数据用来记录每次的结果
* 算法;递归(回溯)
* 返回值:返回排列组合结果数组
* @return [type] [description]
*/
private $count1=0;
public function plzh($arr,$n,$pos,$vis,$ans){
//1、递归返回条件:位数够了就可以返回了
if($pos>$n-1){
global $count1;
$count1++;
dump($ans);
}else{
$len=count($arr);
for ($i=0; $i < $len; $i++) {
if($vis[$i]==0){//没取
$ans[$pos]=$arr[$i];
$vis[$i]=1;
$this->plzh($arr,$n,$pos+1,$vis,$ans);
$vis[$i]=0;
}
}
}
//2、递归里面的算法(一位一位的来取)取一位之后,把这一位的数标记置为已经取了,然后取后面的位的时候从没有取的数里面取,所以需要标记数组
//2.1、 从未取的数里面依次取一位就好 }
public function plzhDemo(){
$arr=array(1,2,3,4,5,6,7);
$n=5;
$vis=array();
for ($i=0; $i <=count($arr) ; $i++) {
$vis[$i]=0;
}
$ans=array();
$this->plzh($arr,$n,0,$vis,$ans);
global $count1;
dump($count1);
} }

还是在函数里面声明了global然后用的。

最新文章

  1. VMP虚拟机加壳的原理学习
  2. JS只弹出一个居中弹出窗口
  3. Linux下Tomcat的启动、关闭、杀死进程
  4. JS函数创建的具体过程
  5. 整数划分 Integer Partition(一)
  6. MySQL.. ERROR! The server quit without updating PID file问题解决
  7. Android_设备隐私获取,忽略6.0权限管理
  8. 与Jquery Mobile的第一次亲密接触
  9. HUNNU11351:Pythagoras&#39;s Revenge
  10. jquery设置元素的readonly和disabled【转】
  11. Map遍历四种常用方法
  12. JSONObjec序列化对象过滤为null的属性
  13. hdu--1072--Nightmare(bfs回溯)
  14. 【BZOJ2049】洞穴勘测(Link-Cut Tree)
  15. L1-Day14
  16. springcloud如何实现服务的平滑发布
  17. 汇编debug工具详解
  18. MYSQL的基本函数 (数学函数)
  19. ubuntu server 在 virtualbox中安装增强包
  20. 远程监控tomcat内存使用

热门文章

  1. 隐马尔科夫模型(HMM)
  2. Windows App开发之文件与数据
  3. cvBoostStartTraining, cvBoostNextWeakClassifier和 cvBoostEndTraining
  4. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
  5. 79.express里面的app.configure作用
  6. Spatial Pyramid Matching
  7. jquery点击弹框外层关闭弹框
  8. 洛谷 P1877 [HAOI2012]音量调节
  9. Java io流的学习
  10. 61.C++文件操作实现硬盘检索