四次元口袋 2019-07-24 14:37 采纳率: 0%
浏览 176

什么是变量作用域,哪些变量可以从哪里访问,什么是“未定义的变量”errors?

Php 中的“变量作用域”是什么? 是一个变量。 可以访问另一个 php 文件? 为什么有时会出现“未定义变量”错误?

  • 写回答

2条回答 默认 最新

  • weixin_38166163 2019-07-24 15:04
    关注

    什么是“变量范围” ?
    变量有一个有限的“作用域” ,或者“能访问地方”。 仅仅因为你写了$foo = 'bar'; 在你的应用程序中的某个地方,并不意味着你可以从应用程序中的其他地方引用$foo。 变量 $foo有一个特定的作用域,在这个作用域中它是有效的,只有同一作用域中的代码才能访问这个变量。
    如何在 PHP 中定义作用域?
    非常简单: PHP 有函数作用域。这是 PHP 中存在的唯一一种作用域分隔符。 函数内部的变量只能在函数内部使用。函数之外的变量可以在函数之外的任何地方获得,但是在任何函数之内不可以。这意味着 PHP 有一个特殊的作用域: 全局作用域。在任何函数之外声明的任何变量都在这个全局范围内。
    例:

    <?php
    $foo = 'bar';
    function myFunc() {
        $baz = 42;}
    

    $foo 位于全局作用域中,$baz 位于 myFunc 中的本地作用域中。 只有 myFunc 中的代码可以访问 $baz。 只有 myFunc 之外的代码才能访问 $foo。 两者都无法彼此获取:

    <?php
    $foo = 'bar';
    function myFunc() {
        $baz = 42;
        echo $foo;  // doesn't work
        echo $baz;  // works}
    echo $foo;  // works
    echo $baz;  // doesn't work
    

    作用域和文件
    文件没有单独的作用域:

    <?php
    $foo = 'bar';
    <?php
    include 'a.php';
    echo $foo;  // works!
    

    同样的规则适用于include代码,就像适用于任何其他代码一样: 只有 function可以有单独作用域。对于作用域,您可以考虑包含像复制和粘贴代码这样的文件:

    <?php
    function myFunc() {
        include 'a.php';
        echo $foo;  // works}
    myFunc();
    echo $foo;  // doesn't work!
    

    在上面的例子中,a.php 包含在 myFunc 中,a.php 中的任何变量都只有局部函数作用域。 仅仅因为它们看起来在 a.php 的全局作用域中并不一定意味着它们是全局作用域,这实际上取决于代码包含 / 执行在哪个context中。
    函数和类中的函数是什么?
    每个新的function都会引入一个新的作用域,就是这么简单。
    函数内部的(匿名)函数

    function foo() {
        $foo = 'bar';
        $bar = function () {
            // no access to $foo
            $baz = 'baz';
        };
        // no access to $baz}
    

    $foo = 'foo';
    class Bar {
        public function baz() {
            // no access to $foo
            $baz = 'baz';
        }
    }
    // no access to $baz
    

    作用域有什么好处?
    处理作用域问题可能看起来很烦人,但是对于编写复杂的应用程序来说,有限的变量作用域是必不可少的!如果您引入的每个变量都可以从应用程序中的其他任何地方获得,那么您就是在遍历所有的变量,而没有真正的方法来跟踪哪些变量发生了改变。可以给变量起的合理名称有限,您可能希望在多个地方使用变量“ $name”。 如果你只能在你的应用程序中使用一次这个唯一的变量名,那么你就不得不求助于真正复杂的命名来确保你的变量是唯一的,并且你没有从错误的代码片段中更改错误的变量。
    看:

    function foo() {
        echo $bar;}
    

    如果没有作用域,上面的函数将做什么? $bar 从何而来? 它的状态是什么? 它是否被初始化了?你每次都要检查吗?不可能啊。接下来就是
    跨越作用域的界限
    正确的方法是: 传入和传出变量

    function foo($bar) {
        echo $bar;
        return 42;}
    

    变量 $bar作为函数参数进入这个范围。单看这个函数,就可以清楚地看到它的值是从哪里来的。 后返回一个值。 调用者就会知道函数将使用什么变量以及返回值从哪里来:

    $baz   = 'baz';
    $blarg = foo($baz);
    

    将变量的作用域扩展为匿名函数

    $foo = 'bar';
    
    $baz = function () use ($foo) {
        echo $foo;};
    $baz();
    

    匿名函数显式地包含周围作用域中的 $foo。 请注意,这与全局作用域不同。
    错误的方式: global
    如前所述,全局作用域有些特殊,函数可以从中导入变量:

    $foo = 'bar';
    function baz() {
        global $foo;
        echo $foo;
        $foo = 'baz';}
    

    这个函数使用和修改全局变量 $foo。 不要这样做! (除非你真的真的真的知道你在做什么,即使那样: 也不要!)
    这个函数的调用者看到的是:

    baz(); // outputs "bar"
    unset($foo);
    baz(); // no output, WTF?!
    baz(); // outputs "baz", WTF?!?!!
    

    没有迹象表明这个功能有任何副作用,但它确实有。当一些函数不断修改并需要某些全局状态时,这很容易变成一团乱麻。您希望函数是无状态的,无论您调用它们的次数多少只对它们的输入执行操作,并返回定义的输出。
    您应该尽可能地避免使用全局作用域; 当然,您不应该将变量从全局作用域“拉”到局部作用域中。

    评论

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏