Drupal许多的函数中都使用了静态变量。按照通常的用法,静态变量的使用应该是这样的:

  1. function drupal_set_title($title = NULL) {
  2. static $stored_title;
  3.  
  4. if (isset($title)) {
  5. $stored_title = $title;
  6. }
  7.  
  8. return $stored_title;
  9. }

但是Drupal使用的方式有些不同。主要的考量应该是这样:可能会有几十上百个函数中使用了静态变量,Drupal需要在某一时刻对这些静态变量都做reset处理。这个时候,不可能对这几十上百个函数都重新调用一次。因此,Drupal需要一种机制,来集中地存放静态变量,这就是函数druap_static()存在的目的:

  1. function &drupal_static($name, $default_value = NULL, $reset = FALSE) {
  2. static $data = array(), $default = array();
  3.  
  4. // First check if dealing with a previously defined static variable.
  5. if (isset($data[$name]) || array_key_exists($name, $data)) {
  6. // Non-NULL $name and both $data[$name] and $default[$name] statics exist.
  7. if ($reset) {
  8. // Reset pre-existing static variable to its default value.
  9. $data[$name] = $default[$name];
  10. }
  11. return $data[$name];
  12. }
  13.  
  14. // Neither $data[$name] nor $default[$name] static variables exist.
  15. if (isset($name)) {
  16. if ($reset) {
  17. // Reset was called before a default is set and yet a variable must be
  18. // returned.
  19. return $data;
  20. }
  21.  
  22. // First call with new non-NULL $name. Initialize a new static variable.
  23. $default[$name] = $data[$name] = $default_value;
  24. return $data[$name];
  25. }
  26.  
  27. // Reset all: ($name == NULL). This needs to be done one at a time so that
  28. // references returned by earlier invocations of drupal_static() also get
  29. // reset.
  30. foreach ($default as $name => $value) {
  31. $data[$name] = $value;
  32. }
  33.  
  34. // As the function returns a reference, the return should always be a
  35. // variable.
  36. return $data;
  37. }

注意,这里drupal_static()返回的是引用。

使用drupal_static()后的函数drupal_set_title()是这样的:

  1. function drupal_set_title($title = NULL, $output = CHECK_PLAIN) {
  2. $stored_title = &drupal_static(__FUNCTION__);
  3.  
  4. if (isset($title)) {
  5. $stored_title = $title;
  6. }
  7.  
  8. return $stored_title;
  9. }

当需要reset集中存储的静态变量时,可以调用函数drupal_static_reset():

  1. function drupal_static_reset($name = NULL) {
  2. drupal_static($name, NULL, TRUE);
  3. }

Drupal如何集中控制静态变量?的更多相关文章

  1. PHP 面向对象编程和设计模式 (2/5) - 静态变量、属性和方法及延迟绑定

    PHP高级程序设计 学习笔记 2014.06.10 Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定. 1.静态变量 static variable ...

  2. [转]Android静态变量的生命周期

    原文地址:https://my.oschina.net/jerikc/blog/137207 Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的 ...

  3. QT,静态变量要记得初始化

    //DbUtil.h #ifndef DBUTIL_H #define DBUTIL_H using namespace std; QString md5Encode(QString passwd); ...

  4. .NET静态变量与静态方法并发的问题

    我们知道,静态变量与静态方法都是在程序编译的时候就定义好了的,并且不会存在多个副本.所以对于静态变量来说,一旦修改了就会影响全局. 因此,静态变量是存在并发性问题的,所以当我们在操作静态变量的时候需要 ...

  5. JAVA的静态变量、静态方法、静态类

    静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象                                ...

  6. 关于C#静态变量初始化问题

    关于这个静态变量,平时自己没有太认真的去认识.最近调项目的bug,让我重新认识了静态变量的特点. 其实,我们一直都在说:静态变量只在类第一次初始化的时候进行初始化,以后都不初始化. 很简单的一句话,但 ...

  7. android 尽量不要使用static静态变量

    使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静 ...

  8. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  9. Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序

    直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...

随机推荐

  1. CocurrentHashMap和HashTable区别分析

    集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...

  2. 【动态规划】POJ1664-放苹果

    非常经典的划分数问题,即相当于把m个物体分成至多n组,求出分组总数. [思路]当前状态dp[i][j]表示将i个物体分成至多j组的分组总数.对于当前状态,有以下两种情形: (1)j组中有组为空,则这种 ...

  3. UVA 12284 Digital Matrix

    思路:这个分清楚情况就很好做了. 注意一点当A的转置等于B的时候(对角线除外),记录A的下三角(或上三角)有cnt个的数与B不同,如果cnt>1则 不需要额外的步数就可以了,否则当k==2时结果 ...

  4. Java学习笔记(15)

    iterator方法 迭代器的作用:就是用于抓取集合中的元素 注:迭代器返回的一个接口类型的实现类,是一种多态的用法,而不是接口在调用方法 public class Demo2 { public st ...

  5. UNIX域套接字连接mysql

    用户可以在配置文件中指定套接字文件的路径,如--socket=/data/mysql/mysql.sock [root@localhost ~]# mysql -uroot -p123456 -S / ...

  6. mysql 下 计算 两点 经纬度 之间的距离 含具体sql语句

    文章转载地址 http://blog.sina.com.cn/s/blog_7bbfd5fd01017d1e.html 感谢作者. 在原文的基础上,我新增了sql语句,方便大家理解 mysql距离计算 ...

  7. [转]mybatis 的简单使用

      需要用到的包:(这里只是其中一个版本,其他的百度) mysql-connector-java-5.1.6-bin mybatis-3.2.2 先看项目目录: 配置文件mybatisconfig.x ...

  8. 我告诉你MSDN

    https://msdn.itellyou.cn/ 微软的软件,系统,官方下载

  9. JavaScript入门详解

    开始开发工作. 一.Alert Confirm Prompt <html> <head> <script type="text/javascript" ...

  10. ejs循环实例

    ... //index page var items=[{title:"文章1"},{title:"文章2"}]; app.get('/',function(r ...