[support] PHP 5.3 upgrade problems

andy baxter andy at earthsong.free-online.co.uk
Wed Oct 14 14:03:46 UTC 2009


Larry Garfield wrote:
> On Wednesday 14 October 2009 12:02:28 am andy baxter wrote:
>
>   
>> What I really want to know is, if I find the (relatively few) places in
>> the code where php5.3 is causing an issue that actually breaks site
>> functions, and apply the fix above (i.e. &$variable -> $variable) or
>> something similar, is this a good way of solving the problem for the
>> time being, given that the site goes public on thursday, or is it just
>> going to break something else, or cause other problems like security
>> holes or whatever?
>>
>> It seems to have stopped the error in the couple of places I've already
>> tried it, but it worries me to just convert a pass-by-reference into a
>> straight parameter pass like this. I like to understand what I am doing
>> rather than just apply a patch, which is why I was asking if anyone can
>> explain a bit more about what's going on here?
>>
>> cheers,
>>
>> andy
>>     
>
> What functions are we talking about?  The answer to that will vary per the 
> exact function being called.
>
> Vis, show us da codez!
>
>   
OK, as an example, this is the log entry for one of the errors that is 
coming up:

Type 	php
Date 	Tuesday, 13 October, 2009 - 18:10
User 	experiment <http://www.lancs.ac.uk/fass/drupal/expt/users/experiment>
Location 
http://www.lancs.ac.uk/fass/drupal/expt/profile/experimentalist/edit
Referrer 	http://www.lancs.ac.uk/fass/drupal/expt/profile/experimentalist
Message 	/Parameter 1 to theme_imagefield_widget() expected to be a 
reference, value given/ in 
//export/depts/fass/drupal/expt/includes/theme.inc/ on line /617/.
Severity 	error
Hostname 	83.216.128.236
Operations 	


This is one of the errors that actually breaks site functions - the 
upload image box doesn't come up on the edit profile page.

I have grepped for the function name and found this:
andy at anthill:/local/www/experiment$ grep -R 
'function.*theme_imagefield_widget' *
sites/all/modules/imagefield/imagefield.module:function 
theme_imagefield_widget_preview($item = NULL) {
sites/all/modules/imagefield/imagefield.module:function 
theme_imagefield_widget_item($element) {
sites/all/modules/imagefield/imagefield_widget.inc:function 
theme_imagefield_widget(&$element) {

I assume that the last declaration is the relevant one because of the 
'&$element'. This function looks like this:

/**
 * FormAPI theme function. Theme the output of an image field.
 */
function theme_imagefield_widget(&$element) {
  drupal_add_css(drupal_get_path('module', 'imagefield') 
.'/imagefield.css');
  return theme('form_element', $element, $element['#children']);
}


Here is another one, which doesn't break anything serious as far as I 
can tell:

Type 	php
Date 	Tuesday, 13 October, 2009 - 23:28
User 	experiment <http://www.lancs.ac.uk/fass/drupal/expt/users/experiment>
Location 	http://www.lancs.ac.uk/fass/drupal/expt/blog/previously-test/edit
Referrer 	http://www.lancs.ac.uk/fass/drupal/expt/blog/previously-test/edit
Message 	/Parameter 1 to content_diff() expected to be a reference, 
value given/ in //export/depts/fass/drupal/expt/includes/module.inc/ on 
line /471/.
Severity 	error
Hostname 	83.216.128.236
Operations 	


Same procedure:
andy at anthill:/local/www/experiment$ grep -R 'function.*content_diff' *
sites/all/modules/cck/includes/content.diff.inc:function 
content_diff(&$old_node, &$new_node) {
sites/all/modules/cck/includes/content.diff.inc:      $function = 
$field_types[$field['type']]['module'] . '_content_diff_values';
sites/all/modules/cck/includes/content.diff.inc:      $function = 
function_exists($function) ? $function : 'content_content_diff_values';
sites/all/modules/cck/includes/content.diff.inc:function 
content_content_diff_values($node, $field, $items) {
sites/all/modules/cck/includes/content.diff.inc:  function 
userreference_content_diff_values($node, $field, $items) {
sites/all/modules/cck/includes/content.diff.inc:  function 
nodereference_content_diff_values($node, $field, $items) {
sites/all/modules/cck/content.module:  if (module_exists('diff') && 
!function_exists('content_diff')) {

Here it looks like the first line above; the function looks like this:
/**
 * Implementation of hook_diff()
 */
function content_diff(&$old_node, &$new_node) {
  $result = array();
  // Prevent against invalid 'nodes' built by broken 3rd party code.
  if (isset($new_node->type)) {
    $type = content_types($new_node->type);
    $field_types = _content_field_types();
    foreach ($type['fields'] as $field) {
      // Ignore fields the current user is not allowed to view.
      if (!content_access('view', $field, NULL, $new_node)) {
        continue;
      }
      $function = $field_types[$field['type']]['module'] . 
'_content_diff_values
';
      $function = function_exists($function) ? $function : 
'content_content_diff
_values';
      $old_values = array();
      $new_values = array();
      if (isset($old_node->$field['field_name'])) {
        $old_values = $function($old_node, $field, 
$old_node->$field['field_name
']);
      }
      if (isset($new_node->$field['field_name'])) {
        $new_values = $function($new_node, $field, 
$new_node->$field['field_name']);
      }
      if ($old_values || $new_values) {
        $result[$field['field_name']] = array(
          '#name' => $field['widget']['label'],
          '#old' => $old_values,
          '#new' => $new_values,
          '#weight' => $field['widget']['weight'],
          '#format' => array(
            'show_header' => FALSE,
          ),
        );
      }
    }
  }
  return $result;
}

I could just remove the & in front of the parameter name in both cases, 
but doing that without understanding what I am doing makes me nervous. 
Why would another function be passing a variable by value when the 
function expects a reference? Is this just bad coding which PHP <5.3 
used to cover for, or some older feature which has been removed?

You could tell me in each case whether you think this hack is safe to 
use, or suggest another one, but what I really need is some better 
understanding of what's happening and why this situation has come about 
so I can do it myself - there are over 400 files in my installation 
which include functions with variable declarations like this, so 
presumably I can't just change all of them from &$ to $.

andy




More information about the support mailing list