php глобальный внутри класса, но вне функции? - PullRequest
0 голосов
/ 02 сентября 2011

Я могу получить доступ к $ conn из моей функции следующим образом:

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

Мне интересно, есть ли способ сделать это в классе ex.

    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 ]

3 голосов
/ 02 сентября 2011

Ваш второй пример возможен, ваш первый нет. Нет такой вещи, как наличие переменной-члена класса, которая является глобальной переменной, или использование области видимости, как в первом примере.

Как правило, я бы рекомендовал полностью не использовать ключевое слово 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 голос
/ 02 сентября 2011

Присвойте это переменной класса .

$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...
       }
    }

Вместо того, чтобы назначать его в конструкторе, вы также можете использовать метод установки, такой как:

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

или (хотя я не рекомендую это) установить переменную в публичную область видимости внутри класса, которая позволяет вам изменять ее по желанию:

class abc{
   public $conn;
   ...
}

$abc = new abc;
$abc->conn = $conn;
0 голосов
/ 02 сентября 2011

Это грязно (мне вообще не нравится "глобальный"), но оно должно работать:

// ...
private $var;
public function foo() {
    global $var;
    $this->var = $var;
}
// ...
0 голосов
/ 02 сентября 2011

Вы не можете иметь глобальный в качестве модификатора.

Вы можете делать то, что хотите, в одном из следующих случаев:

$con;

class abc
{
   private $conn;

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

ИЛИ

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

И для одного объекта вы создаете его экземпляр вместо создания экземпляра для глобального.

0 голосов
/ 02 сентября 2011

Да, просто измените global на var или public, private, protected.

Пример:

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

Подробнее о видимости этих переменных (общедоступных, приватных, защищенных) см. эту страницу на PHP.net.

...