7.x php.module php_eval($code)

Evaluates a string of PHP code.

This is a wrapper around PHP's eval(). It uses output buffering to capture both returned and printed text. Unlike eval(), we require code to be surrounded by <?php ?> tags; in other words, we evaluate the code as if it were a stand-alone PHP file.

Using this wrapper also ensures that the PHP code which is evaluated can not overwrite any variables in the calling code, unlike a regular eval() call.

This function is also used as an implementation of callback_filter_process().

Parameters

$code: The code to evaluate.

Return value

A string containing the printed output of the code, followed by the returned output of the code.

See also

php_filter_info()

Related topics

1 call to php_eval()
1 string reference to 'php_eval'
php_filter_info in modules/php/php.module
Implements hook_filter_info().

File

modules/php/php.module, line 63
Additional filter for PHP input.

Code

function php_eval($code) {
  global $theme_path, $theme_info, $conf;

  // Store current theme path.
  $old_theme_path = $theme_path;

  // Restore theme_path to the theme, as long as php_eval() executes,
  // so code evaluated will not see the caller module as the current theme.
  // If theme info is not initialized get the path from theme_default.
  if (!isset($theme_info)) {
    $theme_path = drupal_get_path('theme', $conf['theme_default']);
  }
  else {
    $theme_path = dirname($theme_info->filename);
  }

  ob_start();
  print eval('?>' . $code);
  $output = ob_get_contents();
  ob_end_clean();

  // Recover original theme path.
  $theme_path = $old_theme_path;

  return $output;
}

Comments

rogical’s picture

/**
 * Helper function.
 * Allow send external variables.
 */
function _php_eval($code, $paras = array()) {
  global $theme_path, $theme_info, $conf;
  
  foreach ($paras as $key => $value) {
    ${$key} = $value;
  }

  // Store current theme path.
  $old_theme_path = $theme_path;

  // Restore theme_path to the theme, as long as php_eval() executes,
  // so code evaluated will not see the caller module as the current theme.
  // If theme info is not initialized get the path from theme_default.
  if (!isset($theme_info)) {
    $theme_path = drupal_get_path('theme', $conf['theme_default']);
  }
  else {
    $theme_path = dirname($theme_info->filename);
  }

  ob_start();
  print eval('

' . $code);
$output = ob_get_contents();
ob_end_clean();

// Recover original theme path.
$theme_path = $old_theme_path;

return $output;
}

?>