在普通的php函数中使用static关键字有什么问题吗?

时间:2010-01-19 17:31:16

标签: php function static

例如:

<?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

因此,假设重复调用以获取用户id只是在内存中执行简单的id返回。不过,我不知道这是否是惯用的php函数。它有点像单身,除了不是OO,我从来没有听说过或看过其他人使用它,所以我想知道以这种方式使用静力学是否有缺点,或者如果有问题我应该知道对于函数中更复杂的静力学用例。

那么,这种静态使用会遇到什么问题?

4 个答案:

答案 0 :(得分:2)

我认为这种方法没有任何问题 - 实际上,我经常使用它作为“非常短暂的缓存机制主义”,这非常有用/有用你有一个被调用很多次的函数,并且执行繁重的计算(比如数据库查询)总是为给定的脚本执行返回相同的值。

而且我知道我不是唯一一个这样做的人:例如,Drupal使用这种机制很多 - 作为缓存。

我看到的唯一“问题”是你想要“清除缓存”:你必须向函数传递一个额外的参数;并在设置该参数时编写几行来“重置”静态缓存。

答案 1 :(得分:2)

Static在这种情况下很好,甚至可以在PHP 4中运行(不应该再发挥作用,但仍然如此)。

答案 2 :(得分:1)

我认为这种方法没有明显的错误。我认为只是大多数实现缓存的人可能使用比简单的静态变量更复杂的设置。如果它有效,请使用它,这就是它存在的原因。

我想不出在计算数字序列的函数中实现缓存的更好方法。例如,假设您正在计算Fibonacci序列中的数字。在不使用缓存的情况下,每次连续调用都会生成一个新列表并重新计算程序已经看到的数字。使用静态变量,您可以简单地返回缓存的n集合的元素小于缓存的长度,并且计算fib(n)的更高数字n将非常简单,因为您将能够从缓存末尾的最后两个元素开始。将其作为单身人员实施将是过度的。

答案 3 :(得分:-1)

我不确定static关键字在该上下文中是否有效。 (虽然我可能完全错了)传统上,像这样的值要么通过引用传递给函数,要么使用global关键字来访问全局范围内的变量。