作用域

优质
小牛编辑
113浏览
2023-12-01

本章阐述的主要包括全局作用域、函数外作用域、函数内作用域、引入代码作用域。魔方加密 PHP 规范对作用域部分进行了较大的修改,请您认真阅读下面的内容,避免代码出现问题。

<?php
    // 函数外作用域

    function test ( ) {
        // 函数内作用域

        include 'file.php';    // 文件中的代码处于 引入代码作用域

        // 函数内作用域
    }

    // 函数外作用域

    include 'file.php';        // 文件中的代码处于 引入代码作用域

    // 函数外作用域

全局作用域

在魔方加密 PHP 规范中,全局作用域是不可见的,这与标准 PHP 规范不同。请看下面的示例。

文件 file1.php,该文件不加密:

<?php
    $a  = 1;

文件 file2.php,该文件加密:

<?php
    include './file1.php';

    $a  = 2;

    function test ( ) {
        global $a;
        echo $a;
    }

    test ( );

运行加密后的 file2.php,输出结果 1。

这是因为在 file1.php 未加密,适用标准 PHP 规范,$a 是一个全局变量;而 file2.php 进行加密,适用魔方加密 PHP 规范,函数 test() 之外定义的 $a 并不是一个全局变量,而是一个 函数外作用域 局部变量,在函数 test() 中因为使用了关键词 global,所以此处的 $a 是一个全局变量,引入的是未加密文件 file1.php 中定义的局部变量。

函数外作用域

函数外作用域是指函数定义之外其它代码区域的作用域。在标准 PHP 规范中,这个区域属于全局作用域;在魔方加密 PHP 规范中,这是一个独立的作用域。

请注意,这是对已有的代码最大的影响。原有全局作用域中定义的全局变量全部变为函数外作用域的局部变量,这些局部变量如果被其它文件使用,必须手动使用 global 关键词进行导出,使之变为全局变量。

函数内作用域

函数内作用域是指函数定义之内的作用域,该作用域中定义的所有变量均为局部变量。

使用 global 关键词可以导出局部变量为全局变量。

引入代码作用域

引入代码作用域出现在 include、include_once、require、require_once 和 eval 中。请看下面的示例。

文件 file1.php,该文件不加密:

<?php
    echo $a;

文件 file2.php,该文件不加密:

<?php
    global $a;
    echo $a;

文件 file3.php,该文件加密:

<?php
    global $a;
    $a  = 1;

    function test1 ( ) {
        $a  = 2;
        include './file1.php';
    }

    function test2 ( ) {
        $a  = 2;
        include './file2.php';
    }

    test1 ( );
    test2 ( );

运行加密后的 file3.php,调用 test1() 出现 $a 未定义警告,调用 test2() 输出结果 1。

这是因为 test1() 中引入的 file1.php 是引入代码作用域,是一个独立的作用域,和 test1() 函数内作用域完全隔绝,而 file1.php 中未定义 $a,所以产生变量未定义的警告;在 test2() 中引入的 file2.php 也是引入代码作用域,但由于使用了 global 关键词,$a 是引入的 file3.php 开头处定义的全局变量 $a

global 关键词

通过 global 关键词可以将当前作用域中的变量注册为全局变量。

全局变量可用于各个作用域之间交换数据。