Есть ли проблемы с использованием статического ключевого слова в простой функции PHP? - PullRequest
1 голос
/ 19 января 2010

Например:

<?php
    function get_current_user_id(){
        static $id;
        if(!$id){
            $id = 5;
            echo "Id set.";
        }
        return $id;
    }


$id = get_current_user_id();

$id2 = get_current_user_id();

$id3 = get_current_user_id();

echo "IDs: ".$id." ".$id2." ".$id3;
?>

// Вывод: Id set.IDs: 5 5 5

http://codepad.org/jg2FR5ky

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

Итак, с какими проблемами я могу столкнуться при использовании этого типа статики?

Ответы [ 4 ]

2 голосов
/ 19 января 2010

Static хорошо в этом контексте и даже работает в PHP 4 (не то, что это должно играть роль, но все же)

2 голосов
/ 19 января 2010

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

И я знаю, что я не единственный, кто делает это: например, Drupal часто использует этот механизм - как кеш.

Единственная «проблема», которую я вижу, это когда вы хотите «очистить кеш»: вам нужно передать дополнительный параметр функции; и закодировать пару строк, чтобы «сбросить» статический кеш при установке этого параметра.

1 голос
/ 19 января 2010

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

Я не могу придумать лучшего способа реализовать кэширование в функции, которая вычисляет последовательность чисел.Например, скажем, вы вычисляли числа в последовательности Фибоначчи.Каждый последующий вызов, без использования кэширования, генерирует новый список и пересчитывает числа, которые программа уже видела.Используя статическую переменную, вы могли бы просто вернуть элемент из кэшированной коллекции n меньше, чем длина кэша, и было бы тривиально просто вычислить более высокие числа n, равные fib(n), так как вы могли бы начать споследние два элемента в конце вашего кэша.Реализация этого как синглтона была бы излишней.

0 голосов
/ 19 января 2010

Я не уверен, что ключевое слово static является действительным в этом контексте. (хотя я могу быть совершенно не прав) Обычно такие значения либо передаются по ссылке в функцию, либо вы используете ключевое слово global для доступа к переменной в глобальной области видимости.

...