2014-08-29 1 views
1

У меня есть некоторый код PHP, который работает примерно так:доступа Глобальные переменные в пределах статического метода в PHP

$var1 = 'Variable 1'; 
$var2 = 'Variable 2'; 

class myClass { 

    function __construct() { 
     $this->var1 = $GLOBALS['var1']; 
     $this->var2 = $GLOBALS['var2']; 
    } 

    public function returnVars() { 
     return $this->var1 . ' ' . $this->var2; //Works fine 
    } 

    public static function returnVars2() { 
     //What should I do here? 
    } 

} 

Если я создаю экземпляр этого класса с помощью $myClass = new myClass(), я могу использовать метод returnVars() или просто получить var1 и var2 от класса просто отлично. Моя проблема в том, что мне нужно использовать глобальные переменные $var1 и $var2 в статическом методе returnVars2(). Я не могу использовать это ключевое слово $this, потому что класс не создается (и они объявляются внутри конструктора), но я все равно не могу нормально обращаться к глобальным переменным.

Любые предложения приветствуются!

+0

Вы пытались использовать ключевое слово 'global'? – Mic1780

+0

См. Этот вопрос [stackoverflow question] (http://stackoverflow.com/questions/25530954/function-which-produces-new-variable-for-use-outside-of-function-php/25531030) –

+0

Точно так же, как вы делаете конструктор? Кстати, вы не должны использовать глобальные переменные, просто отправьте параметры, необходимые для этого метода. Или, может быть, вы хотите использовать вместо переменных переменные? – jeroen

ответ

3

Объявите переменные как статические члены:

class foo { 
    public static $var1; 
    public static $var2; 

    function __construct() { 
     foo::$var1 = $GLOBALS['var1']; 
     foo::$var2 = $GLOBALS['var2']; 
    } 
} 

Тогда вы можете получить доступ к ним, как foo::$varX в любом методе внутри этого класса, статические или нет.

+0

'self :: $ var1' лучше, потому что, когда он решает изменить имя класса, ему придется переписывать все эти' foo :: $ var1' всюду. Принцип Breaks DRY, поэтому +0 – Yang

+0

Это будет зависеть от объекта, который создается как минимум один раз, прежде чем использовать статический метод, иначе переменные не будут инициализированы. – jeroen

+0

@jeroen: правда, но нет другого способа сделать это. не может сделать это при определении атрибута, b ecause, который был бы выражением и не может быть разрешен во время компиляции. –

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