Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Область видимости переменной?


Автор: Kotakota 7.4.2011, 13:28
Привет.
Есть код:
Код


Class Test {
private $matches;

// ..............................

public function myCirlcle($array) {
foreach($array $key=>$value) {

if(preg_match('/^'.$key.'$/',$value,$this->matches) echo 'Совпало!';
                 
}
}
}


Почему кода условие выполнилось и в $this->matches появился результат, я не могу использовать эту переменную в других местах класса.
Она всегда пустая!

А если сделать так:

Код

Class Test {
private $matches;
private $matches2;

// ..............................

public function myCirlcle($array) {
foreach($array $key=>$value) {

if(preg_match('/^'.$key.'$/',$value,$this->matches) {
echo 'Совпало!';
$this->matches2 = $this->matches;

}                 
}
}
}


то в переменной $this->matches2 сохраняется результат и в дальнейшем эту переменную можно использовать!
Если получилось присвоить, то значит и в $this->matches пока она была в цикле, был результат!
А если вызвать $this->matches в любом другом месте вне цикла, она всегда пустая....
Почему так происходит?

Автор: bars80080 7.4.2011, 13:47
во-первых, не видно, что цикл находится в методе

во-вторых, точно уверены, что сразу после цикла в переменной что-то есть?

в-третьих, можно предположить, что $this->matches попадая во внутреннюю область функции становится обычной переменной. то есть в пределах функции используется что-то вроде ${'this->matches'} , а не непосредственно свойство класса. поэтому значение и не оказывается в нём

Автор: Kotakota 7.4.2011, 13:51
Цитата(bars80080 @ 7.4.2011,  13:47)
во-первых, не видно, что цикл находится в методе

во-вторых, точно уверены, что сразу после цикла в переменной что-то есть?

в-третьих, можно предположить, что $this->matches попадая во внутреннюю область функции становится обычной переменной. то есть в пределах функции используется что-то вроде ${'this->matches'} , а не непосредственно свойство класса. поэтому значение и не оказывается в нём

1. Исправил.
2. Пока переменная в цикле, есть ее значение. Если вызвать после цикла, то нет. Пустое значение!
3.  smile

Добавлено @ 13:54
Цитата(bars80080 @ 7.4.2011,  13:47)
в-третьих, можно предположить, что $this->matches попадая во внутреннюю область функции становится обычной переменной. то есть в пределах функции используется что-то вроде ${'this->matches'} , а не непосредственно свойство класса. поэтому значение и не оказывается в нём

Тогда почему $this->matches2 попадая в метод не становится обычной переменной? 

Автор: bars80080 7.4.2011, 13:55
попробуй для первого варианта ещё указать public для переменной, и посмотри результат, будет ли сохраняться значение

Автор: solenko 7.4.2011, 14:53
Все проще. попробуйте не перетирать $this->matches на следующей итерации цикла )
Код

if(preg_match('/^'.$key.'$/',$value,$this->matches) { echo 'Совпало!'; break}

Автор: Kotakota 12.4.2011, 13:16
Цитата(solenko @ 7.4.2011,  14:53)
Все проще. попробуйте не перетирать $this->matches на следующей итерации цикла )
Код

if(preg_match('/^'.$key.'$/',$value,$this->matches) { echo 'Совпало!'; break}

Да, забыл поставить break;
Всем спасибо за ответы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)