回顾变量作用域

[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 协议》,转载必须注明作者和本文链接
六月的风
Junwind
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!