在 drupal 中,此代码会引发无法捕获的 php 错误:
/*
* @param $variables
* An associative array containing:
* - element: An associative array containing the properties of the element.
* Properties used: #title, #title_display, #description, #id, #required,
* #children, #type, #name.
*
* @ingroup themeable
*/
function theme_form_element($variables) {
//print_r($variables); die("daa`");
$element = &$variables['element'];
// This is also used in the installer, pre-database setup.
$t = get_t();
// This function is invoked as theme wrapper, but the rendered form element
// may not necessarily have been processed by form_builder().
$element += array(
'#title_display' => 'before',
);
...
drupal 函数的最后一行抛出错误。
$variables['element']
进入函数时是一个数组。当$element
引用分配给它时,它(在 内$variables
)从 type更改Array
为 type &Array
。该变量$element
将自身报告为 type Array
。
以下行在使用而不是 += 运算符时不会引发相同的错误:
$element = $element + array();
$new = array_merge($element, array());
@iputonmyrobeandwizardhat 要求提供 sscce,我试图在下面提供。但是,该代码不会单独导致与在 drupal 的渲染过程中使用时抛出的相同错误。谁能推荐一种隔离错误的方法?
<?php
function theme_form_element($variables) {
$element = &$variables['element'];
var_dump($variables); //['element'] becomes type &array
//not fatal
$element2 = $element + array( '#title' => 'before');
//not fatal
$element3 = array_merge($element, array( '#title' => 'before'));
$element += array( '#title_display' => 'before');
var_dump($element);
}
$variables_array = array
(
'element' => array
(
'#type' => 'textfield',
'#title' => 'First Name:',
'#default_value' => '',
'#size' => 60,
'#maxlength' => 64,
'#description' => 'First name',
'#required' => 1,
'#input' => 1,
'#autocomplete_path' => '',
'#process' => Array ('ajax_process_form'),
'#theme' => 'textfield',
'#theme_wrappers' => Array('form_element'),
'#defaults_loaded' => 1,
'#tree' => '',
'#parents' => Array('first_name'),
'#array_parents' => Array('first_name'),
'#weight' => 0,
'#processed' => 1,
'#attributes' => Array(),
'#title_display' => 'before',
'#id' => 'edit-first-name',
'#name' => 'first_name',
'#value' => '',
'#ajax_processed' => '',
'#sorted' => 1,
'#children' => '<input type="text" id="edit-first-name" name="first_name" value="" size="60" maxlength="64" class="form-text required" />'
)
);
?>
输入:
// base64_encode(serialize($variables));
YToxOntzOjc6ImVsZW1lbnQiO2E6MjY6e3M6NToiI3R5cGUiO3M6OToidGV4dGZpZWxkIjtzOjY6IiN0aXRsZSI7czoxMToiRmlyc3QgTmFtZToiO3M6MTQ6IiNkZWZhdWx0X3ZhbHVlIjtzOjA6IiI7czo1OiIjc2l6ZSI7aTo2MDtzOjEwOiIjbWF4bGVuZ3RoIjtpOjY0O3M6MTI6IiNkZXNjcmlwdGlvbiI7czoxMDoiRmlyc3QgbmFtZSI7czo5OiIjcmVxdWlyZWQiO2I6MTtzOjY6IiNpbnB1dCI7YjoxO3M6MTg6IiNhdXRvY29tcGxldGVfcGF0aCI7YjowO3M6ODoiI3Byb2Nlc3MiO2E6MTp7aTowO3M6MTc6ImFqYXhfcHJvY2Vzc19mb3JtIjt9czo2OiIjdGhlbWUiO3M6OToidGV4dGZpZWxkIjtzOjE1OiIjdGhlbWVfd3JhcHBlcnMiO2E6MTp7aTowO3M6MTI6ImZvcm1fZWxlbWVudCI7fXM6MTY6IiNkZWZhdWx0c19sb2FkZWQiO2I6MTtzOjU6IiN0cmVlIjtiOjA7czo4OiIjcGFyZW50cyI7YToxOntpOjA7czoxMDoiZmlyc3RfbmFtZSI7fXM6MTQ6IiNhcnJheV9wYXJlbnRzIjthOjE6e2k6MDtzOjEwOiJmaXJzdF9uYW1lIjt9czo3OiIjd2VpZ2h0IjtpOjA7czoxMDoiI3Byb2Nlc3NlZCI7YjoxO3M6MTE6IiNhdHRyaWJ1dGVzIjthOjA6e31zOjE0OiIjdGl0bGVfZGlzcGxheSI7czo2OiJiZWZvcmUiO3M6MzoiI2lkIjtzOjE1OiJlZGl0LWZpcnN0LW5hbWUiO3M6NToiI25hbWUiO3M6MTA6ImZpcnN0X25hbWUiO3M6NjoiI3ZhbHVlIjtzOjA6IiI7czoxNToiI2FqYXhfcHJvY2Vzc2VkIjtiOjA7czo3OiIjc29ydGVkIjtiOjE7czo5OiIjY2hpbGRyZW4iO3M6MTIxOiI8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImVkaXQtZmlyc3QtbmFtZSIgbmFtZT0iZmlyc3RfbmFtZSIgdmFsdWU9IiIgc2l6ZT0iNjAiIG1heGxlbmd0aD0iNjQiIGNsYXNzPSJmb3JtLXRleHQgcmVxdWlyZWQiIC8+Ijt9fQ==