当前位置: 首页 > news >正文

PHP 全局变量

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

一 全局变量的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/>";
?>

 

  二 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'],调用外部变量的一个别名而已!

转载于:https://www.cnblogs.com/zhuyongzhe/p/10280312.html

相关文章:

  • 朋友圈继续扩大!科蓝软件联合蚂蚁金服发布“移动金融逸平台”
  • MySQL面试题之如何优化一条有问题的SQL语句?
  • UOJ131 [NOI2015] 品酒大会
  • uoj#349. 【WC2018】即时战略(动态点分治)
  • 未来科技展亮相杭州 七大5G应用领域打开全新想象
  • 在Linux下创建文件,文件名中包含当前时间
  • Java源码解析 - ThreadPoolExecutor 线程池
  • 通过sys.objects查询SQL SERVER数据库改动内容
  • 共轭分布
  • 为什么要用IPython/Jupyter?
  • Java8实用技能
  • 悉尼将举办农历节庆典迎猪年
  • 2018,你的专属云上回忆录
  • transform matrix阅读后的理解
  • 15对金婚夫妻亮相《挑战不可能之加油中国》分享婚姻心得
  • [译] 怎样写一个基础的编译器
  • Bytom交易说明(账户管理模式)
  • css属性的继承、初识值、计算值、当前值、应用值
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JS实现简单的MVC模式开发小游戏
  • NSTimer学习笔记
  • React-Native - 收藏集 - 掘金
  • vuex 笔记整理
  • - 概述 - 《设计模式(极简c++版)》
  • 观察者模式实现非直接耦合
  • 深入 Nginx 之配置篇
  • 实现菜单下拉伸展折叠效果demo
  • 手写一个CommonJS打包工具(一)
  • 思考 CSS 架构
  • 学习JavaScript数据结构与算法 — 树
  • 终端用户监控:真实用户监控还是模拟监控?
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #Spring-boot高级
  • (3)nginx 配置(nginx.conf)
  • (4)(4.6) Triducer
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)重识new
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .Net Core和.Net Standard直观理解
  • .NET 设计一套高性能的弱事件机制
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 的字符串暂存池
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net多线程总结
  • [ 数据结构 - C++] AVL树原理及实现
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [2669]2-2 Time类的定义
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [ANT] 项目中应用ANT