2012-04-05 5 views
3

Я хотел бы получить доступ к переменным класса с for цикла, вот мой простой класскласс доступа к переменным с цикл

class test{ 
    public $var1 = 1; 
    public $var2 = 2; 
    public $var3 = 3; 
    public $var4 = 4; 
} 


$class = new test(); 

это, как я пытаюсь получить доступ к переменным с петлей

for($i = 1; $i <= 4; $i++){ 
    echo $class->var.$i; 
} 

и я получаю сообщение об ошибке Notice: Undefined property: test::$var in C:\xampp\htdocs\test\index.php on line 12

Ну, это не большая ошибка, и я действительно получаю значение, эхо, но пока не пойму, почему я получаю эту ошибку?

также, если я сделать это таким образом, что все работает нормально:

echo $class->var1; 
+0

попробуйте изменить имя объекта класса –

ответ

2

Вы не получаете реальную стоимость вторит, вы получаете $i эхо.

echo $class->var.$i; интерпретируется как echo ($class->var).($i);. Поскольку var не является переменной (отсюда и ошибка), она становится echo ''.$i;, поэтому вы получаете значение $i. Просто так получилось, что var1 имеет значение 1. (Изменить $var1 к чему-то еще, и вы увидите, что я имею в виду)

Чтобы устранить эту проблему, вы можете сделать это:

for($i = 1; $i <= 4; $i++){ 
    $class->{'var'.$i} 
} 

материал внутри {} вычисляется первым, поэтому считывается правильное свойство.

6
for($i = 1; $i <= 4; $i++){ 
    $var = 'var' . $i; 
    echo $class->$var; 
} 

Или, как уже упоминалось в комментариях, это будет работать в новых версиях PHP

for($i = 1; $i <= 4; $i++){ 
    $class->{'var' . $i} 
} 
+3

Я думаю, что '$ class -> {'var'. $ I}' также работает в более поздних версиях PHP. – Xeoncross

+0

@Xeoncross yes, $ class -> {'var'.$ i} работает как минимум до 5.3. [Этот код на кодовом коде] (http://codepad.viper-7.com/LVw7j0) – orourkek

+0

@Xeoncross: он также работает на PHP 5.2 :-) http://codepad.org/iiMKVNCd –

0

В этом уже отлично работает на самых последних версиях PHP, но попробуйте это:

for($i = 1; $i <= 4; $i++){ 
    $v = 'var'.$i; 
    echo $class->$v; 
} 
2

Код не делает то, что вы думаете. Это только повторение 1-4 из-за вашего $i в цикле for. Если вы хотите изменить vars в классе, ваш результат будет по-прежнему равным 1-4.

Неопределенные уведомления о недвижимости - это ключ: он пытается получить доступ к объекту var.

Если вы хотите хранить данные, которые повторяются и/или связанных с ними, особенно, как в вашем примере, это, как правило, больше подходит для хранения в виде массива: (.) ​​

class test{ 
    public $vars; 

    public function __construct() 
    { 
     $this->vars = array(1, 2, 3, 4); 
    } 
} 

$obj = new test(); 

foreach($obj->vars as $var) 
{ 
    echo $var; 
} 
2

Точечный оператор получает используемый эхом, а не вызов участника классу $.

Одна из многих решений:

for($i = 1; $i <= 4; $i++){ 
    echo $class->{'var'.$i}; 
} 

live example here