回顾变量作用域
[TOC]
超级全局变量
或者说内置变量,或者理解为环境变量,比如 $_SERVER
, $_POST
, 他们可以在任何地方使用。他们的值一般是依托当前的运行环境而定的。当然我们也可以手动设置的。
下面是示例
// 假设链接传的是 127.0.0.1/test.php?a=aaa
# 1. 函数外,或者说脚本全局中,可访问
var_dump($_GET['a']); // 函数外可访问, 结果 aaa
$_GET['a'] = 'bbb';
# 2. 函数内,也可访问
function dd(){
var_dump($_GET['a']); // 函数外,修改了其值,函数内依然生效
}
dd(); // bbb
# 类的属性,类的方法中
class Test{
//public $name = $_GET['a']; // 直接报错,不可这样访问,有趣的是,常量可以这样赋值
public function dd() {
var_dump($_GET['a']);
}
}
$test = new Test();
$test->dd();
常量
当前脚本中 ,都可以访问到
define("SERVER_NAME", "learnPHP");
# 1. 常量在函数外,或者脚本全局都可用
var_dump(SERVER_NAME);
# 2. 函数内也可访问
function dd() {
var_dump(SERVER_NAME);
}
dd();
# 类中
class Test{
public $name = SERVER_NAME; // 注意这里,很有趣,常量是可以这样赋值的。变量不行
public function dd() {
var_dump(SERVER_NAME);
}
}
$test = new Test();
var_dump($test->name);
$test->dd();
变量
函数外的变量
$a = 'aaa';
# 1. 函数外部,或者说脚本全局中
var_dump($a); // 不用想,肯定能访问的
# 2. 函数内部,正常情况下是不能访问的
function dd() {
var_dump($a); // 访问不到外部的全局变量
// 如果我们想访问外部的全局变量,我们可以这样
var_dump($GLOBALS['a']); // 这样其实是利用了 $GLOBALS 超级全局变量的便利,外部的全局变量,其实都会保存到 $GLOBALS 里面
// 还有另外一种办法
global $a; // 我们使用 global 关键字,声明函数内的$a为一个全局变量,和外部的$a形成映射关系,修改其值,也会影响外部的$a变量。
var_dump($a);
$a = 'aaa111';
}
dd();
var_dump($a); // 可以看到,外部的$a变量已经被函数内的改变了
# 3. 类中
class Test{
// public $name = $a; // 这种直接报错,不能这样用
public function dd() {
var_dump($a); // 这样访问不到
var_dump($GLOBALS['a'] . '3333'); // 可以访问,同样,是利用了超级全局变量的便利
global $a;
var_dump($a . '4444'); // 也可以访问,把方法内的变量,声明为全局的,要注意,需要和外部的变量同名才有意义
}
}
$test = new Test();
var_dump($test->dd());
函数内的变量
function dd() {
$a = 'aaa';
global $b; // 将函数内的变量声明为全局的,外部是可以访问的
$b = '111';
$GLOBALS['c'] = 222; // 或者这种方法
}
dd();
var_dump($a); // 函数内定义的,外部是访问不到的
var_dump($b);
var_dump($c);
class Test{
//public $name = $c; // 这种直接报错,不能这样写
public function dd() {
var_dump($c . "方法中"); // 这样直接用外部的变量是不行的
// 同样,我们将其变为全局的
global $c;
var_dump($c . '方法中222');
// 或者这样
var_dump($GLOBALS['c'] . '方法中333');
}
}
$test = new Test();
$test->dd();
类属性变量
class Test{
public $name = 'xxx';
public function dd() {
// 在类的方法中访问属性 , 同样是依托于类或类的实例
var_dump($this->name);
}
}
var_dump($name); // 不能访问, 函数内更不用提, 因为其是属于类的
// 我们要依托于类,或者类的实例去访问才可
$test = new Test();
$test->dd();
类方法中的变量
class Test{
public function dd() {
$name = 'xxx';
global $a;
$a = 123;
$GLOBALS['B'] = 'BBB';
}
}
$test = new Test();
$test->dd();
var_dump($name); // 访问类方法中的变量,这样肯定是不行的
var_dump($a); // 类方法中声明其为全局变量,则可以访问, 注意我们要先去调用方法过才行
var_dump($GLOBALS['B']);
function dd() {
global $a;
var_dump($a);
var_dump($GLOBALS['B']);
}
dd();
静态变量
像下面这种定义了一个静态变量,其实没什么实际意义
static $a;
$a = 1;
++$a;
var_dump($a);
下面这样也是没有意义
function dd() {
static $a;
++$a;
var_dump($a);
}
dd();
当我们多次调用一个函数时,静态变量会记住之前调用的值,我们可以这样理解,函数执行完后,其并不会被立即销毁
function dd() {
static $a;
++$a;
var_dump($a);
}
dd(); // 1
dd(); // 2
dd(); // 3
总结
注意 global 和 $GLOBALS 还是有区别的
global 是你得先声明为全局变量,才可使用,
$GLOBALS 是利用全局变量都存放在超级全局变量$GLOBALS中的便利获取的。可直接用
其实我们多敲代码,慢慢就能记住。
本作品采用《CC 协议》,转载必须注明作者和本文链接