2010-11-25 3 views
1

Я пытаюсь выполнить ту же функцию dosomething() для нескольких переменных $lastsum $avatar $angels $city $square в PHP.Передача имен переменных в виде строки

$lastsum->dosomething(); 
$avatar->dosomething(); 
$angels->dosomething(); 
$city->dosomething(); 
$square->dosomething(); 

Есть ли способ, чтобы сделать этот код понятнее, перечисляя имена переменных в массиве строк и выполняет функцию с для цикла. Я ищу что-то вроде этого. Кто-нибудь знает правильный способ сделать это в PHP?

$all = ['lastsum' , 'avatar', 'angels' , 'city' , 'square']; 
foreach (....){ 
    $(nameofvariable)->dosomething(); 
} 

ответ

4

Что случилось с

$all = array($lastsum , $avatar, $angels, $city, $square); 
foreach (....){ 
    $variable->dosomething(); 
} 

Для достижения точно то, что вы» искать, использовать переменные переменные

$all = array('lastsum' , 'avatar', 'angels' , 'city' , 'square'); 
foreach ($all as $x) { 
    $$x->dosomething(); 
} 

Многие считают, что это плохой стиль.

1

Если вы хотите использовать переменные переменные, было бы так:

function dosomething(&$var) { 
    $var .= 'bar'; 
} 

$a = 'foo'; 
$b = 'bar'; 
$vars = array('a', 'b'); 
foreach ($vars as $var) { 
    dosomething($$var); 
} 

var_dump($a); // foobar 
var_dump($b); // barbar 

Если $a является объектом, то вы можете сделать $$var->dosomething().

EDIT: ПРИМЕЧАНИЕ. В большинстве случаев, если вам нужно использовать переменные-переменные, вы можете захотеть использовать правильную структуру данных, а не массив.

+1

Переменные переменные ^.^Oh PHP ... – mpen 2010-11-25 20:52:02

+1

@Mark: Heh. Мне еще предстоит найти переменные переменных. Я думаю, что это перенесено из эпохи `register_globals` или чего-то еще. Потому что массив обеспечивает аналогичную функциональность и намного больше. – netcoder 2010-11-25 20:55:37

1

Не изящное решение. Тем не менее, вы могли бы использовать в eval():

$all = array('lastsum' , 'avatar', 'angels', 'city', 'square'); 

foreach ($all as $var) { 
    $code = "\$${var}->dosomething();"; 
    eval($code); 
} 

В противном случае, хранить объекты в массиве:

$all = array($lastsum , $avatar, $angels, $city, $square); 

foreach ($all as $obj) { 
    $obj->dosomething(); 
} 
1

Другой вариант:

$all = array('lastsum' , 'avatar', 'angels' , 'city' , 'square'); 

foreach ($all as $x) { 
    $GLOBALS[$x]->dosomething(); 
} 

Не уверен, что, если вы могли бы сделать метод требует от GLOBALS суперглобальных, но вы могли бы, скорее всего, доступ статические свойства/функции.