Как изменить этот код PHP без локальной переменной? - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть такая функция:

function get_title($keyword) {

    $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
        // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    return $titles[$keyword];
}

Хорошая ли практика хранить такой массив в локальной переменной? Например, у него около 50 названий. Поэтому каждый раз, когда я вызываю эту функцию - скрипт загружает 50 заголовков?

Я думаю об использовании global, но разве это не плохая практика?

Я новичок в PHP, рано я писал в JS. В JS я могу сделать это с замыканиями:

var get_title = function() {

    var titles = {
        'p1': 'Title 1',
        'p2': 'Title 2',
        // ... other data
        'pm': 'Some other title',
        'pn': 'One more title'
    }

    return function(keyword) {
        return titles[keyword];
    }
}();

Здесь, массив заголовков не является глобальным, и он не загружается каждый раз, когда я вызываю функцию. Но как это сделать в PHP?

Ответы [ 6 ]

2 голосов
/ 25 апреля 2011

Похоже, здесь уместно глобальное.

Старайтесь не обращать внимания на людей, которые говорят, что "такое-то есть всегда " зло "". Такие обобщения опасны, как вы теперь выясните.

2 голосов
/ 25 апреля 2011

Либо:

$titles = array(
    'p1'   => 'Title 1',
    'p2'   => 'Title 2',
     // ... other data
    'pm'   => 'Some other title',
    'pn'   => 'One more title'
);

function get_title($keyword) {
    global $titles;
    return $titles[$keyword];
}
get_title('p1');

или

class Something {
    private static $titles = array(
        'p1'   => 'Title 1',
        'p2'   => 'Title 2',
         // ... other data
        'pm'   => 'Some other title',
        'pn'   => 'One more title'
    );

    public static function get_title($keyword) {
        return self::$titles[$keyword];
    }
}
Something::get_title('p1');

Использование статического класса здесь немного похоже на замыкания в Javascript.

Если память не является проблемой, донане беспокойся об этом.

1 голос
/ 25 апреля 2011

Ну, в php переменные функции локальные, они не видны внешнему миру, как в javascript.Если вы хотите, чтобы php var работал как javascript var, вам нужно добавить global перед переменной, как эта -> global $ var;Теперь, так как вы не хотите устанавливать $ title каждый раз, когда запускаете функцию, вы можете объявить ее как статическую

function get_title($keyword) {

static $titles = array(
    'p1'   => 'Title 1',
    'p2'   => 'Title 2',
    // ... other data
    'pm'   => 'Some other title',
    'pn'   => 'One more title'
);

return $titles[$keyword];

}

1 голос
/ 25 апреля 2011

Вы можете очень легко сделать то, что вы хотите, с помощью переменной static:

function get_title($keyword) {

    static $titles = null;

    if($titles === null) {
        $titles = array(
            'p1'   => 'Title 1',
            'p2'   => 'Title 2',
            // ... other data
            'pm'   => 'Some other title',
            'pn'   => 'One more title'
        );
    }

    return $titles[$keyword];
}

Трюк "инициализация null / проверка / установка значения" (вместо установки значения * 1006)* напрямую) позволяет использовать любой код, который вам нравится для инициализации переменной (включая неконстантные выражения).

Я бы предпочел это вместо global, потому что он лучше скрывает деталикак получается $titlesСтатическое свойство класса - это еще один способ сделать это;выбор между ними - ИМХО вопрос стиля.

1 голос
/ 25 апреля 2011

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

1 голос
/ 25 апреля 2011

$titles поступает из базы данных? Если нет, то это действительно микрооптимизация, и я почти могу сказать, что мгновенное использование этой переменной никогда не станет узким местом для оптимизации.

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

Другим решением является создание статического класса с $titles в качестве частного статического члена. Тогда это просто вопрос создания открытого метода, вызывающего этот массив.

Эти решения будут создавать экземпляр вашего массива только один раз.

Редактировать : Ах, Фриц демонстрирует именно то, что я имею в виду.

...