php全局在类中但在函数外?

时间:2011-09-02 06:21:22

标签: php mysql linux oop adodb

我可以从我的函数中访问$ 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...
       }
    }

我希望你能明白我的意思。在此先感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

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

但是,一般情况下,我建议您完全避免使用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是什么,但是你不必遍历所有类并更改对该变量的每个引用。

对于全局变量,跟踪哪些变量可用于哪些函数或以结构化方式进行操作要困难得多。此外,还有更多的诱惑是继续在全局变量上依赖更多依赖,直到你失去了拥有类的好处。

答案 1 :(得分:1)

将其分配给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;

答案 2 :(得分:0)

您不能将全局视为修饰符。

您可以在以下方式中执行您想要的操作:

$con;

class abc
{
   private $conn;

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

OR

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

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

答案 3 :(得分:0)

它很脏(我根本不喜欢“全球”)但它应该有效:

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

答案 4 :(得分:-2)

是的,只需将global更改为varpublicprivateprotected

示例:

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

有关这些变量(public,private,protected)的可见性的更多信息,请参阅PHP.net上的this page