Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Тема про '$this->$val'

31K
07 марта 2009 года
Alex_sss
12 / / 24.01.2008
:) Вообщем то, хотелось бы обсудить тему про то, как ведет себя
$this->$val внутри класса, где $val - это любая переменная.

Есть такой класс

Код:
class test
{
  function first ($array)
  {
      while (list($key , $val) = each($array))
      {                                                  
           if (!(isset($this->$val)) || (empty($this->$val)))
          {
            $number = $key + 1;
            echo 'Iteration № '.$number.'<br>';
            $this->$val = 'it is set';
          }
      }  //Когда заканчивается первая итерация $this->$val стирается
         //Да и вообще он стирается после каждой итерации    
      if (empty($this->$val))
      {
         echo 'Yes it is empty';
      }
   
  }
}

$array = array('1','2');

$obj = new test;
$obj->first($array);


В этом примере $this->$val ведет себя ни как обычная переменная, потому что после каждой итерации она почему то стирается :confused:, а обычная переменная не стирается. :rolleyes:

У кого-какие соображения?
Если у кого-то есть информация про эту конструкцию (ссылки) - post'тите
244
07 марта 2009 года
UAS
2.0K / / 19.07.2006
А вы подставьте то, что хотите сохранить..
$this->$val в двух итерациях примет вид: $this->1 и $this->2. Теперь надо почитать про то, как переменные можно называть и как нет.
И ещё я удивляюсь, как у вас код это ошибок не вызывает. Хотя, наверно, просто error_reporting() не выставлен на показ ошибок
444
07 марта 2009 года
patison
323 / / 15.03.2007
Или я туплю или объясните мне... Причем тут вообще $this??? $this , по крайней мере в С++, является указателем на объект класса для которого вызывается тот или иной метод, и юзается для явного обращения к членам класса (я не думаю что пхп оч отличется в этом плане). Т.е. в Данном случае $val должен быть членом класса.
А тут я вообще не вижу что-б у класса были члены (свойства).
285
07 марта 2009 года
Romik
479 / / 24.11.2002
в этом кода автор, сам того не подозревая, воспользовался возможностью обращения к переменной через псевдоним. Сравните два примера:
[highlight=php]
$a = "b";
$$a = "1";
print "[" . $a . "]\n"; #
print "[" . $$a . "]\n"; # [1]
print "[" . $b . "]\n"; # [1]
[/highlight]
и
[highlight=php]
class c {
function __construct() {
$val = "d";
$this->$val="2";
}
}

$obj = new c();
print_r($obj);
#c Object
#(
# [d] => 2
#)
[/highlight]

в первом случае через $$a идёт обращение к $b, так как $a содердит имя переменной b
во втором случае действует тот же принцип. $val содержит имя, php поддерживает динамическое создание атрибутов. Получается атрибут d создаётся в момент присваивания ему значения. вот и вся магия.
31K
07 марта 2009 года
Alex_sss
12 / / 24.01.2008
Цитата: patison
Или я туплю или объясните мне... Причем тут вообще $this??? $this , по крайней мере в С++, является указателем на объект класса для которого вызывается тот или иной метод, и юзается для явного обращения к членам класса (я не думаю что пхп оч отличется в этом плане). Т.е. в Данном случае $val должен быть членом класса.
А тут я вообще не вижу что-б у класса были члены (свойства).



На этот вопрос я и сам хотел получить ответ :rolleyes:. В самом деле $val - это не свойство класса (member) :eek:. В этом весь и прикол :o. Если бы это было свойство я и тему бы не создавал.

А вот еще один прикол

Код:
class test
{
  var $VAR;
 
  function one ($v)
  {
    $this->VAR = $v;                      
    $this->$v = 'string string string';
  }
 
  function string ()
  {
    $v = $this->VAR;   //$v = 'no string'
    echo $this->$v;    //='string string string'
  }
 
  function no_string ()
  {
    $v = $this->VAR;
    echo $v;
  }
}

$obj = new test;
$obj->one('no string');
$obj->string();
echo '<br>';
$obj->no_string()


Видите разницу между методом string() и no_string()?
444
07 марта 2009 года
patison
323 / / 15.03.2007
Цитата:
Видите разницу между методом string() и no_string()?


Видим.
Для того что-бы получить доступ (в вашем случае записать в...) к члену класса, нужно использовать $this. Когда вы пишите

 
Код:
function string ()
  {
    $v = $this->VAR;   //$v = 'no string'
    echo $this->$v;    //='string string string'
  }

То $v это не $this->$v. Почему? Потому что создаётся локальная переменная $v для этого метода (функции), а членом класса является именно $this->$v.
31K
07 марта 2009 года
Alex_sss
12 / / 24.01.2008
Romik спасибо,
очень доходчиво объяснил, теперь всё ясно
366
08 марта 2009 года
int
668 / / 30.03.2005
Хммм, выходит, php допускает переменные с пробелами? O_O
Потому что $this->$v - это как $this->"no string". Я прав?
31K
14 марта 2009 года
Alex_sss
12 / / 24.01.2008
Цитата: int
Хммм, выходит, php допускает переменные с пробелами? O_O
Потому что $this->$v - это как $this->"no string". Я прав?



Не совсем понял, что вы хотели этим сказать...

Вообщем внутри класса (да и нетолько внутри) значению переменной можно дать значение, если можно так выразится.

Например (внутри класса)

 
Код:
$var = 'string';
$this->$var = 'no_string';
//Это значит, что 'string' => 'no_string';
366
15 марта 2009 года
int
668 / / 30.03.2005
 
Код:
$v = $this->VAR;   //$v = 'no string'
echo $this->$v;    //='string string string'
Но тут-то другая ситуация, тут $this->"no string" = 'string string string'
Получается имя переменной с пробелом.
276
17 марта 2009 года
Rebbit
1.1K / / 01.08.2005
Цитата: int
Получается имя переменной с пробелом.


Не переменной, а поля класса. А что тут удивительного. Ключ масива может быть строчкой с пробелом :). Почему имя поля нет.
Я правда первый раз о таком услышал за что Alex_sss большое спасибо. Попаду домой и попробую как такое засериализируется.

366
18 марта 2009 года
int
668 / / 30.03.2005
Я думаю, что если это использовать без классов, то тоже получится
 
Код:
$a="a b c";
$$a="cba";
echo "{".$a." == ".$$a."}";

Вообще, да, $GLOBALS['a b c']='cba' это нормально :)

Хм,
 
Код:
$a='e';
$$a='b';
$$$a='c';
$$$$a='d';
Так тоже прокатит? :)) $GLOBALS['c']='d'?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог