передача имен переменных в виде строки - PullRequest
1 голос
/ 25 ноября 2010

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 25 ноября 2010

Что не так с

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

Для достижения точно того, что вы ищете, используйте переменные переменные

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

Многие люди считают это плохимхотя стиль.

1 голос
/ 26 ноября 2010

Другая альтернатива:

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

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

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

1 голос
/ 25 ноября 2010

Не элегантное решение. Однако вы можете использовать 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 голос
/ 25 ноября 2010

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

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().

РЕДАКТИРОВАТЬ: ПРИМЕЧАНИЕ: В большинстве случаев, если вам нужно использовать переменные переменные, вы можете вместо этого рассмотреть возможность использования правильной структуры данных, например, массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...