回顾上节内容,函数外面的变量与函数内部的变量,就算名字是一样的,但它们是完全独立的两个变量,内存地址都不一样的。这节开始探讨,变量的作用域问题。
通常说作用域,有2个:
局部作用域:只能在所定义的函数范围内使用。
全局作用域:在函数的“外部”范围使用。
第5行的变量$a它的作用域就是全局作用域,它影响不了函数里的变量$a。
反之,函数里的变量$a影响不了外部的变量$a。所以,在PHP中,局部和全局作用域是不重叠的。
而有些编程语言却不是这样,全局作用域是包括局部作用域的,像后面要学习的JS。
不同函数里的变量作用域只在它自己所在的函数里有效
第6行和第9行是不同的函数,想想也应该明白,就算函数里变量名字一样吧,但它俩是没有理由相互影响的。
回顾前面,文件加载的那四个控制结构(require_once等),它们是可以让不同文件里的变量相互影响相互传递的。但如果2.php文件定义一个函数f(),f里return require_once 1.php,那1.php文件里的变量在2.php里不能获取到。
这个地方需要注意下,把require_once等文件加载控制结构放入函数里,就实现不了不同文件变量的相互传输作用了。看似函数的返回值是“require_once dirname(__FILE__).'/1.php'”,其实不是的,肯定是先执行“require_once”,然后“return”,变量作用域受到函数的影响了。
超全局变量:
是不是所有的变量都一样,不能同时作用于函数外函数内?——不是的。
PHP还有一种变量叫做超全局变量,在函数的内部和外部都可以使用,是可以被影响的。超全局变量又称作预定义变量,只有系统内部预定义的那几个,程序员不能在程序中创建超全局变量。
超全局变量有几个是非常重要的,没有它们就没办法写业务逻辑,楠神以后会单独重点介绍其他几个有很大作用的超全局变量,这节先看第一个超全局变量$GLOBALS。
超全局变量$GLOBALS必须大写,前面没有下划线,它可以被赋予各种类型数据,超全局变量基本上都是当数组来用的。看示例:
看效果:
函数外的$GLOBALS影响到函数内的$GLOBALS了。这两个$GLOBALS其实就是同一个内存地址的变量,反之,在函数内修改,肯定函数外的也会被修改。
再看一示例:
为什么$a的值是9?它是被第8行的代码影响了。
$GLOBALS如果用全局作用域里的一个变量名做下标,那它俩已建立引用关系了。
超全局变量$GLOBALS实际用处不大,楠神在做开发时,都是函数需要什么样的参数我都以实参的形式传进去,不会依靠超全局变量传数据,就怕造成数据混乱。
其实就这样的,PHP虽然提供了各种的语法增加了编程多样化,有些东西楠神感觉就是鸡肋,没太大用处,没有非得用它的必要,不是PHP有什么知识程序员就得必须要用。
除了$GLOBALS,如果用global关键字在函数内定义一个变量,也能实现超全局的作用。PHP手册里的示例:
函数中的global 语句,其实是创建了一个跟外部变量同名的局部变量,并通过“引用”的方式指向了外部变量的数据区。
$GLOBALS和global关键字真心用的不多,如果感兴趣自己多搜百度了解吧。