2017-01-02 2 views
-1

Вот мой рабочий код: -Установка частной переменной в конструкции не работает

public static function getOperatingSys() { 

    $user_agent = $_SERVER['HTTP_USER_AGENT']; 

    $osPlatform = "Unknown OS"; 

    $osArray = array(
     '/windows nt 10/i'  => 'Windows 10', 
     '/windows nt 6.3/i'  => 'Windows 8.1', 
     '/windows nt 6.2/i'  => 'Windows 8' 
     ); 

    foreach ($osArray as $regex => $value) { 

     if (preg_match($regex, $user_agent)) { 
      $osPlatform = $value; 
     } 

    } 

    return $osPlatform; 
} 

Как вы можете видеть $user_agent = $_SERVER['HTTP_USER_AGENT']; работает.

Однако, как я могу преобразовать его в это ?:

private $user_agent; 

    public function __construct() { 
     $this->user_agent = $_SERVER['HTTP_USER_AGENT']; 
    } 

    public static function getOperatingSys() { 

     $osPlatform = "Unknown OS"; 

     $osArray = array(
      '/windows nt 10/i'  => 'Windows 10', 
      '/windows nt 6.3/i'  => 'Windows 8.1', 
      '/windows nt 6.2/i'  => 'Windows 8' 
      ); 

     foreach ($osArray as $regex => $value) { 

      if (preg_match($regex, $user_agent)) { 
       $osPlatform = $value; 
      } 

     } 

     return $osPlatform; 
    } 

Я помещаю private $user_agent, но как я могу сделать это так, что она равна $_SERVER['HTTP_USER_AGENT']; и то, как я могу использовать его/ее называют в моей функции getOperatingSys()?

+2

'если (preg_match ($ регулярное выражение, $ this-> user_agent)) {' –

+0

@Anant Я получаю эту ошибку: 'Фатальная ошибка: неперехваченным Ошибка: Использование $ это, когда не в контексте объекта в ' – jasonmoqio

ответ

2

Первое, что вам нужно изменить, - сделать getOperatingSys более не статической функцией. Второе, что нужно было бы использовать $ this-> при ссылке на user_agent. Что-то вроде ниже должно работать:

private $user_agent; 

public function __construct() { 
    $this->user_agent = $_SERVER['HTTP_USER_AGENT']; 
} 

public function getOperatingSys() { 

    $osPlatform = "Unknown OS"; 

    $osArray = array(
     '/windows nt 10/i'  => 'Windows 10', 
     '/windows nt 6.3/i'  => 'Windows 8.1', 
     '/windows nt 6.2/i'  => 'Windows 8' 
     ); 

    foreach ($osArray as $regex => $value) { 

     if (preg_match($regex, $this->$user_agent)) { 
      $osPlatform = $value; 
     } 

    } 

    return $osPlatform; 
} 
+0

вопрос только в том, почему я должен удалить статический? я не понимаю, thanx – jasonmoqio

+1

Как только вы переключились на объявление чего-то в классе, вы теперь используете объектно-ориентированное программирование. При объектно-ориентированном программировании вы определяете класс, который имеет состояние и операции, которые вы можете выполнять на нем, чтобы либо манипулировать состоянием, либо выполнять операции. Функция, которая не является статичной, относится к определенному экземпляру вашего класса, у которого есть состояние, которое вы можете изменить. Функция, статическая с другой стороны, не относится к конкретному экземпляру, поэтому вы не можете обращаться к переменным в каком-либо конкретном экземпляре. См. Http://php.net/manual/en/language.oop5.static.php – Brian

+0

ОК спасибо. теперь в моем исходном рабочем коде (до того, как я изменил его на ваш код), какой из них лучше? мой оригинальный код или ваш новый код? – jasonmoqio

Смежные вопросы