Использование переменных переменных в простой функции PHP - PullRequest
0 голосов
/ 04 января 2012

На днях мне дали этот огромный набор массивов и сказали сделать HTML-страницу с кучей или кнопками select / radio, чтобы я написал несколько простых функций, чтобы упростить вещи.

Это моя функция для генерации очень больших выделений HTML.

function genSelect($name) {
    $selectReturn = '<select name="'.$name.'">';
        foreach(${$name} as $value=>$text){
            $selectReturn .= '<option value="'.$value.'"';
            if($evalThis->loaded_settings[$name]['value']==$value)
                $selectReturn .= ' SELECTED ';
            $selectReturn .= '>'.$text.'</option>';
        }
    $selectReturn .= '</select>';
return $selectReturn;
}

Кажется, это не работает, потому что ${$name} просто ничего не вызывает / не работает, как я ожидаю. У меня уже есть работа, где я просто передаю массив, хотя вызов функции, но это меня беспокоило, что я делал неправильно с переменными переменными в этом коде.

Редактировать: Чтобы придать некоторый контекст, это загружается в виде Joomla, чтобы построить гигантский интерфейс для входа в настройки. Эта функция находится в файле lib и загружается require_once вместе с другим файлом, содержащим все используемые мной массивы. База данных содержит только текущие значения этих настроек, а массивы содержат все возможные опции для различных меню select / radio / dropdown и централизованы в отдельном файле по причинам языка / перевода.

Разъясняя некоторые вопросы, которые задавали люди, $name просто содержит имя используемого массива, а также имя ввода HTML select / radio / checkbox. $evalThis - это массив, содержащий значения, которые база данных имеет в настоящее время.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Проблема в том, что ${$name} не определен внутри области действия функции.Вам нужно будет либо ссылаться на глобальную переменную следующим образом:

$GLOBALS[$name]  // bad

Или добавить это вверху функции:

global ${$name};  // worse

ПРЕДУПРЕЖДЕНИЕ: Этокакой ужас.Не делайте этого :-) Я советую просто передать массив, как вы упоминали ранее.

1 голос
/ 04 января 2012

кажется, что массив с именем, хранящимся в $ name, определен в глобальном контексте, а не в этой функции.

$somearr = array('x', 'y');
function genSelect($name) {
    $selectReturn = '<select name="'.$name.'">';

    foreach(${$name} as $value=>$text){
        $selectReturn .= '<option value="'.$value.'"';
        if($evalThis->loaded_settings[$name]['value']==$value)
            $selectReturn .= ' SELECTED ';
        $selectReturn .= '>'.$text.'</option>';
    }

    $selectReturn .= '</select>';
    return $selectReturn;
}
echo genSelect('somearr'); //doesnt work, somearr is global


$somearr = array('x', 'y');
function genSelect($name) {
    global $somearr;
    $selectReturn = '<select name="'.$name.'">';

    foreach(${$name} as $value=>$text){
        $selectReturn .= '<option value="'.$value.'"';
        if($evalThis->loaded_settings[$name]['value']==$value)
            $selectReturn .= ' SELECTED ';
        $selectReturn .= '>'.$text.'</option>';
    }

    $selectReturn .= '</select>';
    return $selectReturn;
}
echo genSelect('somearr'); //works, note 'global $somearr' line at the beginning of genSelect

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

function genSelect($array, $name) { ... }

echo genSelect($someArr, 'someArr');

Может показаться, что это дублирование набора текста, но лучше, чтобы ваши методы не зависели от глобальной области видимости. Кстати, ваша переменная $ evalThis также находится вне области действия.

...