一、什么是作用域
在 PHP 脚本的任何位置都可以声明变量,但是,声明变量的位置 直接影响访问变量的范围。这个可以访问的范围称为作用域scope。
二、作用域的几种类型
- 局部变量
- 函数参数
- 全局变量
- 静态变量
三、局部变量与全局变量
在 函数内部 声明的变量就是局部变量。
function getName(){
$name = 'Anonymous66';
echo $name;
}
getName(); // 输出 Anonymous66
函数变量和全局变量是完全隔绝的,也就是无法相互访问。
// 声明一个全局变量
$name = 'Anonymous66';
function getName(){
echo $name;
}
getName(); // 报错 $name 未定义
那么,如何在函数内部访问全局变量呢?
// 声明一个全局变量
$name = 'Anonymous66';
function getName(){
global $name;
echo $name;
}
getName(); // 输出 Anonymous66
四、函数参数
参数是通过调用代码将值传递给函数的 局部变量。
function getName($name){
echo $name;
}
getName('Anonymous66'); // 输出 Anonymous66
五、静态变量
当一个函数完成时,它的所有变量通常都会删除,如果期望某个局部变量不被删除,在第一次声明变量时使用static关键字。静态变量在程序整个运行期间都不释放,直到整个程序运行结束。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。
function getName(){
static $index = 1;
$name = 'Anonymous66 ';
echo $name . $index;
$index++;
}
getName(); // 输出 Anonymous66 1
getName(); // 输出 Anonymous66 2
getName(); // 输出 Anonymous66 3
类中的静态变量
静态变量 属于类,而不属于类的某个实例。这个变量对所有实例都有效。
:: 是作用域限定操作符,这里用的是 self 作用域,而不是 $this 作用域,$this 作用域只表示类的当前实例,self:: 表示的是类本身。
class Man{
public static $index = 1;
public function getIndex()
{
self::index ++;
echo self::index . '<br />';
}
}
$ironMan = new Man();
$ironMan ->getIndex();
$SpiderMan = new Man();
$SpiderMan->getIndex();
// 输出结果:
// 2
// 3
六、总结
1、函数内想要访问全局变量需要使用global关键字。
2、函数参数是针对函数的局部变量
3、静态变量是跟随整个程序,直到结束,但是它也只能在自己的作用域使用。