Тема про '$this->$val'
$this->$val внутри класса, где $val - это любая переменная.
Есть такой класс
{
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'тите
$this->$val в двух итерациях примет вид: $this->1 и $this->2. Теперь надо почитать про то, как переменные можно называть и как нет.
И ещё я удивляюсь, как у вас код это ошибок не вызывает. Хотя, наверно, просто error_reporting() не выставлен на показ ошибок
А тут я вообще не вижу что-б у класса были члены (свойства).
[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 создаётся в момент присваивания ему значения. вот и вся магия.
А тут я вообще не вижу что-б у класса были члены (свойства).
На этот вопрос я и сам хотел получить ответ :rolleyes:. В самом деле $val - это не свойство класса (member) :eek:. В этом весь и прикол :o. Если бы это было свойство я и тему бы не создавал.
А вот еще один прикол
{
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()?
Видим.
Для того что-бы получить доступ (в вашем случае записать в...) к члену класса, нужно использовать $this. Когда вы пишите
{
$v = $this->VAR; //$v = 'no string'
echo $this->$v; //='string string string'
}
То $v это не $this->$v. Почему? Потому что создаётся локальная переменная $v для этого метода (функции), а членом класса является именно $this->$v.
очень доходчиво объяснил, теперь всё ясно
Потому что $this->$v - это как $this->"no string". Я прав?
Потому что $this->$v - это как $this->"no string". Я прав?
Не совсем понял, что вы хотели этим сказать...
Вообщем внутри класса (да и нетолько внутри) значению переменной можно дать значение, если можно так выразится.
Например (внутри класса)
$this->$var = 'no_string';
//Это значит, что 'string' => 'no_string';
echo $this->$v; //='string string string'
Получается имя переменной с пробелом.
Не переменной, а поля класса. А что тут удивительного. Ключ масива может быть строчкой с пробелом :). Почему имя поля нет.
Я правда первый раз о таком услышал за что Alex_sss большое спасибо. Попаду домой и попробую как такое засериализируется.
$$a="cba";
echo "{".$a." == ".$$a."}";
Вообще, да, $GLOBALS['a b c']='cba' это нормально :)
Хм,
$$a='b';
$$$a='c';
$$$$a='d';