【问题标题】:php global within a class but outside a function?php全局在一个类内但在一个函数外?
【发布时间】:2011-09-02 06:21:21
【问题描述】:

我可以像这样从我的函数中访问 $conn:

function xyz($a){
    global $conn;
    ....
}

我想知道是否有办法在课程中做到这一点。

    class abc
    {
       global $conn;

       public function xyz($a)
       {
          $conn->execute...
       }

       public function xya($a)
       {
          $conn->execute...
       }
    }

上述方法给了我一个错误。我知道我可以这样访问它:

    class abc
    {
       public function xyz($a)
       {
          global $conn;
          $conn->execute...
       }

       public function xya($a)
       {
          global $conn;
          $conn->execute...
       }
    }

我希望你能明白我的意思。提前感谢您的帮助。

【问题讨论】:

    标签: php mysql linux oop adodb


    【解决方案1】:

    你的第二个例子是可能的,你的第一个不是。没有类的成员变量是全局变量,或者像您在第一个示例中那样使用范围。

    不过,一般来说,我建议完全避免使用 global 关键字。我做了很多 PHP 编程,但从未在任何严肃的事情上使用过它(事实上,在过去 10 年左右的时间里根本没有使用过)。

    如果您需要能够在整个类中访问变量,我会将变量传递给您的类构造函数,如下所示:

    class abc
    {
       private $conn;
    
       function __construct($conn)
       {
          $this->conn = $conn;
       }
    
       public function xyz($a)
       {
          $this->conn->execute();
       }
    
       public function xya($a)
       {
          $this->conn->execute();
       }
    }
    

    那么你就有了

    $myabc = new abc($conn);
    

    这样,您就可以明确哪些变量可用于哪些函数。它还使将来更容易/可能将不同的 $conn 值赋予不同的类,甚至重命名 $conn 是什么,但您不必遍历所有类并更改对该变量的每个引用。

    使用全局变量,要跟踪哪些变量可用于哪些函数,或者以结构化的方式进行跟踪要困难得多。此外,在您失去拥有类的好处之前,您更倾向于不断增加对全局变量的依赖。

    【讨论】:

      【解决方案2】:

      将其分配给class variable

      $conn = 'something';
      class abc
          {
             private $conn;
      
             public function __construct($conn) {
                 $this->conn = $conn;
             }
      
             public function xyz($a)
             {
                $this->conn->execute...
             }
      
             public function xya($a)
             {
                $this->conn->execute...
             }
          }
      

      除了在构造函数中赋值,还可以使用setter方法如:

      public function setConn($conn) {
        $this->conn = $conn;
      }
      

      或者(虽然我不推荐这样做)将变量设置为类中的公共范围,这样您就可以随意更改它:

      class abc{
         public $conn;
         ...
      }
      
      $abc = new abc;
      $abc->conn = $conn;
      

      【讨论】:

      • 构造方法是最好的,因为资源显然是类的其余部分运行所必需的
      【解决方案3】:

      您不能将 global 作为修饰符。

      您可以通过以下方式做您想做的事情:

      $con;
      
      class abc
      {
         private $conn;
      
         public function __construct($conn) {
             $this->conn = $con;
         } .....
      }
      

      class abc
      {
         static public $conn; ....
      }
      

      对于其中一个对象,您实例化它而不是为全局实例化。

      【讨论】:

        【解决方案4】:

        它很脏(我根本不喜欢“全局”)但它应该可以工作:

        // ...
        private $var;
        public function foo() {
            global $var;
            $this->var = $var;
        }
        // ...
        

        【讨论】:

          【解决方案5】:

          是的,只需将 global 更改为 varpublic,private,protected

          示例:

          class myClass {
               public $myClassVar = "Apples";
               public __construct(){
                    echo( $this->myClassVar );
               }
          }
          

          有关这些变量(公共、私有、受保护)的可见性的更多信息,请参阅 PHP.net 上的this page

          【讨论】:

            猜你喜欢
            • 2019-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-18
            • 1970-01-01
            • 2022-09-23
            • 2012-06-04
            • 1970-01-01
            相关资源
            最近更新 更多