是否有与在一个普通的PHP函数使用static关键字的任何问题?(Are there any iss

2019-10-19 05:10发布

例如:

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

//输出:编号set.IDs:5 5 5

http://codepad.org/jg2FR5ky

由此推想重复调用,以获取用户ID只是做一个ID的一个简单的返回仍然在内存中。 我不知道这是习惯用法的PHP函数,虽然。 这有点像一个单身,但不是面向对象的,我从来没有听说过或使用它看到其他人,所以我不知道是否也有缺点,以这种方式使用静态,或者是否有陷阱,我应该知道的在功能静态的更复杂的用例。

所以,可能我这种类型的静态的使用会遇到什么样的问题?

Answer 1:

我不认为这有什么不妥的做法-事实上,我用它自己很多时候,作为一个“ 非常短的寿命缓存mecanism”,当你有一个被称为很多的功能,这是伟大/有用次,不重计算(如数据库查询)始终为脚本的给定执行返回相同的值。

我知道我不是唯一一个这样做:Drupal的,例如,使用此mecanism很多 - 作为缓存,太。

唯一的“问题”,我看到的是,当你想“清除缓存”:你必须通过一个其它附加参数的功能; 和几行代码的当参数设置为“重置”静态缓存。



Answer 2:

Static就是在这种背景下细,甚至在PHP 4的工作方式(不是应该再发挥作用,但仍然)。



Answer 3:

我不认为有什么错明确地使用这种方法。 我认为这只是谁实现缓存大多数人可能使用更复杂的设置这样做不是简单的静态变量。 如果它的工作原理,使用它,这就是为什么它的存在。

我想不出来实现在计算数字序列的功能缓存更好的办法。 例如,假设您在Fibonacci序列中进行计算的数字。 每个连续通话,而无需使用的缓存,将产生一个新的列表,并重新计算程序已经看到的数字。 使用一个静态变量,你可以简单地返回n的缓存集合的元素大于缓存的长度较小,这将是平凡简单的计算机更高的数字正fib(n)因为你将能够启动与缓存结束的最后两个元素。 实现这个作为一个单独会矫枉过正。



Answer 4:

我不是很确定的static关键字在这方面有效。 操作(虽然我可能是完全错误的)传统上,这样的值作为参考或者传递到函数或者你可以使用global关键字在全球范围内访问变量。



文章来源: Are there any issues with using static keyword in a plain php function?