Dalam Drupal 7, atau lebih tinggi, gunakan variabel statis yang ditangani dengan drupal_static () .
drupal_static()
adalah fungsi yang menangani penyimpanan pusat untuk variabel statis. Berbeda dari variabel yang dideklarasikan menggunakan static
kata kunci, variabel statis yang ditangani drupal_static()
dapat diakses dari setiap fungsi; ini dimungkinkan karena drupal_static()
mengembalikan konten variabel dengan referensi, memungkinkan setiap fungsi mengubahnya.
Misalkan Anda perlu memberikan nilai antara penangan menu, dan implementasi hook_block_view () ; Anda bisa menggunakan kode berikut.
function mymodule_menu() {
return array('path/%' => array(
'page callback' => 'mymodule_callback_function',
'page arguments' => array(1),
));
}
function mymodule_callback_function($data) {
$data_passer = &drupal_static('mymodule_block_data');
$data_passer = $data;
// Other logic specific to this page callback.
}
function mymodule_block_view($delta = '') {
// $data_passer will now contain the value of $data, from above.
$data_passer = &drupal_static('mymodule_block_data');
// Change the block content basing on the content of $data_passer.
}
Dalam hal data perlu diakses lebih sering, Anda harus menggunakan variabel lokal statis yang akan berisi nilai yang dikembalikan drupal_static()
. Karena variabel statis hanya dapat diinisialisasi dari nilai literal , dan variabel statis tidak dapat ditetapkan ke referensi , satu-satunya kode yang bekerja mirip dengan yang berikut. (Kode ini diambil dari user_access () .)
// Use the advanced drupal_static() pattern, since this is called very often.
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['perm'] = &drupal_static(__FUNCTION__);
}
$perm = &$drupal_static_fast['perm'];
Nilai yang dikembalikan dari drupal_static()
diset ulang setiap kali bootstrap Drupal; jika Anda membutuhkan nilai yang disimpan antara halaman yang berbeda, maka Anda perlu menggunakan tabel database untuk menyimpan nilai, atau menggunakan variabel_get () / variable_set () .
Drupal 6 tidak menerapkan drupal_static()
, tetapi Anda dapat menyalin kodenya dalam fungsi yang didefinisikan dalam modul Anda sendiri.
function &mymodule_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;
}
Sebelum menggunakan variabel statis dengan drupal_static()
(atau fungsi porting belakang didefinisikan dalam modul Anda), Anda harus mempertimbangkan hal-hal berikut:
- Kode hanya berfungsi ketika kode yang mengatur variabel statis berjalan sebelum kode untuk mendapatkan nilainya; jika perintah eksekusi bukan yang dipikirkan, kode tidak berfungsi. Ketika urutan eksekusi tidak didefinisikan secara jelas dalam dokumentasi Drupal, ada risiko urutan perubahan dalam versi Drupal yang akan datang; periksa perintah eksekusi tidak berubah dalam versi Drupal yang Anda gunakan untuk menerapkan kode Anda.
- Drupal bisa menerapkan mekanisme untuk berbagi data di antara kait yang berbeda. Misalnya, dalam kasus implementasi yang berbeda dari hook_form_alter () , setiap implementasi dapat berbagi data dengan
hook_form_alter()
implementasi lainnya menggunakan $form_state
; dengan cara yang sama, form handler validasi, dan handler form submission, dapat berbagi data menggunakan $form_state
parameter yang dilewatkan oleh referensi. Sebelum menerapkan kode Anda sendiri, verifikasi dimungkinkan untuk berbagi data menggunakan mekanisme berbeda yang sudah diterapkan oleh Drupal untuk kasus tertentu.