Drupal如何集中控制静态变量?
2023-09-11 14:16:42 时间
Drupal许多的函数中都使用了静态变量。按照通常的用法,静态变量的使用应该是这样的:
function drupal_set_title($title = NULL) { static $stored_title; if (isset($title)) { $stored_title = $title; } return $stored_title; }
但是Drupal使用的方式有些不同。主要的考量应该是这样:可能会有几十上百个函数中使用了静态变量,Drupal需要在某一时刻对这些静态变量都做reset处理。这个时候,不可能对这几十上百个函数都重新调用一次。因此,Drupal需要一种机制,来集中地存放静态变量,这就是函数druap_static()存在的目的:
function &drupal_static($name, $default_value = NULL, $reset = FALSE) { static $data = array(), $default = array(); // First check if dealing with a previously defined static variable. if (isset($data[$name]) || array_key_exists($name, $data)) { // Non-NULL $name and both $data[$name] and $default[$name] statics exist. if ($reset) { // Reset pre-existing static variable to its default value. $data[$name] = $default[$name]; } return $data[$name]; } // Neither $data[$name] nor $default[$name] static variables exist. if (isset($name)) { if ($reset) { // Reset was called before a default is set and yet a variable must be // returned. return $data; } // First call with new non-NULL $name. Initialize a new static variable. $default[$name] = $data[$name] = $default_value; return $data[$name]; } // Reset all: ($name == NULL). This needs to be done one at a time so that // references returned by earlier invocations of drupal_static() also get // reset. foreach ($default as $name => $value) { $data[$name] = $value; } // As the function returns a reference, the return should always be a // variable. return $data; }
注意,这里drupal_static()返回的是引用。
使用drupal_static()后的函数drupal_set_title()是这样的:
function drupal_set_title($title = NULL, $output = CHECK_PLAIN) { $stored_title = &drupal_static(__FUNCTION__); if (isset($title)) { $stored_title = $title; } return $stored_title; }
当需要reset集中存储的静态变量时,可以调用函数drupal_static_reset():
function drupal_static_reset($name = NULL) { drupal_static($name, NULL, TRUE); }
相关文章
- 【转】静态变量和静态函数导致的问题
- 【C/C++学院】0801-重定向以及文件扫描/二进制加密解密/简单加密/按照密码加密/动态库与静态库
- destoon 下apache伪静态排除目录规则
- JSP中的动态包含和静态包含的区别
- phpcms v9 生成静态页
- macbook发布本地静态页面
- Go gin静态文件的使用、自定义模板渲染器
- OC中的全局变量和静态变量
- Qt 静态函数中的信号和槽问题
- 这道静态变量题,我居然考了0分
- 【Spring】@Value作用于静态变量
- C++ 在类的定义时初始化非静态变量
- 在java类中,是先执行类的构造函数还是先执行类的私有非静态变量
- c++ 静态变量
- 第二十讲:神州路由器静态路由的配置
- 支持DevOps和功能安全/信息安全的静态代码分析器 Klocwork——Klocwork的主要功能特性:提供⽹⻚端集中式分析与管理平台;⽀持的IDE;⽀持的编译器;⽀持的操作系统| 资质认证
- 开启URL伪静态的方法
- java===java基础学习(13)---this,static(静态变量和静态方法)的使用
- 华为云服务器静态BGP和全动态BGP带宽有什么区别?
- 编译型和解释型、动态语言和静态语言,OC的语言类型(Objective-C)