【问题标题】:Global Variables vs. Local Variables全局变量与局部变量
【发布时间】:2013-08-01 07:46:49
【问题描述】:

好的,我不确定我是否正确理解了这个概念(我正在学习 PHP)。如果我理解正确: 全局变量可以在同一个文档的任何地方引用,也可以在用“include”链接的文档中引用。局部变量只能在它们所在的函数中被引用。

好的,如果我理解正确(这是我发布帖子的一半原因,以确保我正确),真的需要局部变量吗?我的意思是,如果每个用户都定义了自己的变量并且需要全部保存,我可以看到它很有用......有点?但是,我认为为此使用数据库会简单得多。我想在什么情况下使用局部变量?

【问题讨论】:

    标签: php variables global local


    【解决方案1】:

    在您要求需要本地变量之前,您的问题是有道理的。总的来说,您应该尽可能避免使用全局变量。

    编写一些工具/webapp 并且只有两三个我自己的自己的全局变量,我用它们来设置实际应用程序的运行,这种情况并不少见。

    考虑一下:

    $db = new PDO($conn, $usr, $pass);
    function select(array $fields, $tbl, $where = '')
    {
        global $db;//use the global variable
        return $db->query('SELECT '.implode(', ', $fields).' FROM '.$tbl.' WHERE '.$where);
    }
    

    就其本身而言,您可能会争辩说这段代码会一直运行良好。 $db 是什么很清楚,因此这里没有明显错误。
    但是,假设您包含几个使用相同 $db 变量的其他文件,并且其中一个文件中存在错误,导致 $db 被重新分配:

    $db = 'I used to be a PDO instnace';
    select(array('*'), 'tbl');
    

    这将显示一个错误,将您指向return $db->query(); 的行,它会显示类似“尝试调用非对象的方法”

    祝你调试好运! $db 重新分配到哪里了?除了逐步筛选您的代码之外,没有其他方法可以知道。

    宣布一切全球就像每天晚上把你的钱包放在人行道上。

    它可能仍然是您上次离开它的地方,但它的状态(或值)很可能已被其他一些实体/实体(人或代码)更改(显着),这些实体/实体(人或代码)可能已经使用了您的钱包(或变量)作为他们自己的,幸福地不知道你把它留在那里以备将来参考。在编写类或函数时,您也将使用该代码的同事称为用户。因此,即使他们无意伤害,全球也是一场意外,正在等待发生。

    顺便说一句,函数参数局部变量,所以我确定你已经在使用它们了,但并不知情。

    最好如下定义select函数:

    function select(PDO $connection, array $fields, $tbl = 'tbl', $where = null)
    {
        $query = 'SELECT '.implode(', ', $fields).' FROM '.$tbl;
        $query .= $where !== null ? ' WHERE '.$where : '';
        return $connection->query($query);
    }
    

    在这个函数中,我创建了一个局部变量以使代码更具可读性/可维护性。就像我说的,所有的参数也是局部变量,所以在这个函数返回之后,任何被分配来容纳它们持有的值的内存都可以被释放。当您使用全局变量时,垃圾收集器无法完成其工作,因为变量仍在范围内,并且可能会在代码中进一步使用。只有在脚本完成运行后才会释放内存。

    全局变量会在每次尝试释放内存时告诉 垃圾收集器“等一下”,因为脚本稍后可能需要该变量。充满全局的代码是一个部落会写的东西。

    全局变量(全局范围内的变量)会产生混乱的代码,当您试图避免名称冲突时,您会发现自己声明了像 $i_for_looping_over_array1 = 0; 这样的变量

    好吧,这可能有点极端,但无论如何你最终都会对你的 var 进行伪命名空间,那么为什么不使用 proper 命名空间、作用域、类等呢?

    使用global 关键字很慢

    每当您在函数中使用global 关键字时,您实际上是在说:寻找一个名为$someName 的变量,它可以在任何地方。将相同的变量作为参数传递,就是告诉函数use this

    当传递一个对象时,您实际上传递的是对该对象的引用(即它的地址),因此不需要查找。基元被复制,因此也没有查找。

    把自己想象成一个调酒师。你更愿意在哪里工作? Pub AllIsGlobalHere,在那里,你的第一天,你的老板说:“如果客户要求什么,瓶子可以在任何地方,地窖、地板或右上角的橱柜”,或 Pub CheckTheArguments。后者是您直接进入的地方,当客户要啤酒时,您的老板和/或客户会很有帮助地指出您应该参考哪个草案。

    【讨论】:

      【解决方案2】:

      封装需要局部变量,这是编程的好习惯。

      全局变量实际上是一种不好的做法,因为变量可以在应用程序的任何地方更改,相信我,如果你有多个包含和多个包含,那么很难调试为什么变量的值不是预期的。 ..

      如果您需要使用全局变量,也许您应该考虑使用单例或将变量作为参数传递给需要它的函数。

      【讨论】:

      • 单身人士的死亡!此外,OP 仍然是 learnign php,并且正在学习范围,所以我想说他还没有编写自己的类
      • 好吧,我也不喜欢单例,但它是全局变量的替代品。
      【解决方案3】:

      在编程中,很多情况下您只需要在孤立的上下文中使用变量。用于存储计算的中间结果的计数器、函数参数和变量等,在整个应用程序中没有任何意义。 此外,还有递归函数的特殊情况。局部变量将为递归函数的每个实例获得自己不同的地址,这是递归正常工作的必要条件。 但是,在 PHP 应用程序中,建议尽可能避免使用全局变量。

      【讨论】:

        【解决方案4】:

        选择本地而不是全局的几个原因:

        变量占用内存。如果每个变量都在全局范围内,则会占用大量内存。局部变量只存在于范围内,因此它们只是暂时使用内存,然后再次释放内存....所以更好的内存使用是一个很好的论点。

        如果所有变量都是全局变量,那么函数 A 和函数 B 可能都更新了一个变量,但都没有意识到对方已经改变了它,所以它可能会导致你没有意识到值已经被一个函数,并假设它在另一个函数中仍然有效。

        【讨论】:

          【解决方案5】:

          我想在什么情况下使用局部变量?

          局部变量是定义在局部范围(函数)内的变量,这些变量仅在该范围内可用,而在外部不可用,例如:

          $foo = 'foo';
          function bar(){
           $foo = 'bar';
          }
          
          echo $foo; //prints foo
          

          例如,您可以看到相同的变量名可以在本地范围内使用而不会产生任何影响。

          【讨论】:

            【解决方案6】:

            如果您只使用全局变量,则需要为每个新计数器指定一个新名称,哈哈。

            封装需要 vars 的可见性:变量只能受您想要访问它的对象的影响。例如:

            class Person{
              private $_money;
              public function rob(){
                return $this->_money;
              }
            }
            

            只有 Person 类的对象才能操作他的钱,所以,如果你想要它们,你必须得到面具和枪。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-24
              • 2017-11-08
              • 1970-01-01
              相关资源
              最近更新 更多