4
votes

Warning: Parameter 3 to showBlogSection() expected to be a reference, value given in /home/smartsta/public_html/includes/Cache/Lite/Function.php on line 100

I'm getting the above error displaying within my content areas on my Joomla site all a sudden, any suggestions?

Update: No such luck finding access to defined file and directory within godaddy ftp file directory, ftp, or Joomal C-panel. Within FTP, I cannot find access to this particular file to investigate what is on line 100. Within the Joomla panel, in Global Configurations, I was able to toggle 'error message' to none for atleast this error to be hidden. Within the cache directory I do not see any options to get into the folder, though it displays. I also see this at the bottom of that c-panel screen, but just links to a joomla help site, and within the fields I do not see described area to toggle 'ON or OFF' "Following PHP Server Settings are not optimal for Security and it is recommended to change them: PHP register_globals setting is ON instead of OFF "

Update2!:

I've found the file in question, below is the code. Line 100 only states:

global $$object_123456789;

application/x-httpd-php Function.php PHP script text

<?php

/**
* This class extends Cache_Lite and can be used to cache the result and output of functions/methods
*
* This class is completly inspired from Sebastian Bergmann's
* PEAR/Cache_Function class. This is only an adaptation to
* Cache_Lite
*
* There are some examples in the 'docs/examples' file
* Technical choices are described in the 'docs/technical' file
*
* @package Cache_Lite
* @version $Id: Function.php 47 2005-09-15 02:55:27Z rhuk $
* @author Sebastian BERGMANN <[email protected]>
* @author Fabien MARTY <[email protected]>
*/

// no direct access
defined( '_VALID_MOS' ) or die( 'Restricted access' );

require_once( $mosConfig_absolute_path . '/includes/Cache/Lite.php' );

class Cache_Lite_Function extends Cache_Lite
{

    // --- Private properties ---

    /**
    * Default cache group for function caching
    *
    * @var string $_defaultGroup
    */
    var $_defaultGroup = 'Cache_Lite_Function';

    // --- Public methods ----

    /**
    * Constructor
    *
    * $options is an assoc. To have a look at availables options,
    * see the constructor of the Cache_Lite class in 'Cache_Lite.php'
    *
    * Comparing to Cache_Lite constructor, there is another option :
    * $options = array(
    *    (...) see Cache_Lite constructor
    *    'defaultGroup' => default cache group for function caching (string)
    * );
    *
    * @param array $options options
    * @access public
    */
    function Cache_Lite_Function($options = array(NULL))
    {
        if (isset($options['defaultGroup'])) {
            $this->_defaultGroup = $options['defaultGroup'];
        }
        $this->Cache_Lite($options);
    }

    /**
    * Calls a cacheable function or method (or not if there is already a cache for it)
    *
    * Arguments of this method are read with func_get_args. So it doesn't appear
    * in the function definition. Synopsis :
    * call('functionName', $arg1, $arg2, ...)
    * (arg1, arg2... are arguments of 'functionName')
    *
    * @return mixed result of the function/method
    * @access public
    */
    function call()
    {
        $arguments = func_get_args();
        $id = serialize($arguments); // Generate a cache id
        if (!$this->_fileNameProtection) {
            $id = md5($id);
            // if fileNameProtection is set to false, then the id has to be hashed
            // because it's a very bad file name in most cases
        }
        $data = $this->get($id, $this->_defaultGroup);
        if ($data !== false) {
            $array = unserialize($data);
            $output = $array['output'];
            $result = $array['result'];
        } else {
            ob_start();
            ob_implicit_flush(false);
            $target = array_shift($arguments);
            if (strstr($target, '::')) { // classname::staticMethod
                list($class, $method) = explode('::', $target);
                $result = call_user_func_array(array($class, $method), $arguments);
            } else if (strstr($target, '->')) { // object->method
                // use a stupid name ($objet_123456789 because) of problems when the object
                // name is the same as this var name
                list($object_123456789, $method) = explode('->', $target);
                global $$object_123456789;
                $result = call_user_func_array(array($$object_123456789, $method), $arguments);
            } else { // function
                $result = call_user_func_array($target, $arguments);
            }
            $output = ob_get_contents();
            ob_end_clean();
            $array['output'] = $output;
            $array['result'] = $result;
            $this->save(serialize($array), $id, $this->_defaultGroup);
        }
        echo($output);
        return $result;
    }

}

?>
1
When you look into /home/smartsta/public_html/includes/Cache/Lite/Function.php on line 100, what do you see there? And you should just log errors instead displaying them, so they don't appear in the page.hakre
I haven't checked out the file just yet, but before this 'all-a-sudden-error' there wasn't anything wrong within the code. Is it even possible that something could just appear at said line 100?? How do I log the errors so they don't appear in the page?fred randall
Thanks for this response of course!fred randall
Checkout the PHP manual, e.g. PHP Error Logging - Also all-a-sudden-errors are treated on this site in the category that they all the sudden will disappear and don't need any answers (and questions) for that. Please see the FAQ, this site is about specific question you have with some code. If you can't make clear what your problem is, your question will be too broad - blog.stackoverflow.com/2010/10/asking-better-questionshakre

1 Answers

7
votes

It is not exactly an error. It is a warning.

Suddenly? Perhaps you have upgraded/updated your PHP version. Or changed PHP configuration to "strict mode".

The message "expected to be a reference, value given" means the called function expected to receive a reference, not a value. Look:

$something = 9;
show_section($something);
// here you are passing a variable
// this will be accepted as a reference

show_section(9);
// here you are NOT passing a reference
// here you are passing a VALUE

When you pass "by reference", the function can change the variable value... in the example above:

function show_section(&$parameter) {
    $parameter = 'changed!';
}
  1. Note the ampersand symbol & before the $parameter - this is how we specify a function requires a REFERENCE.

  2. AFTER the function call, in the example above, the variable $something value will be the changed! string.


The line throwing the error is NOT the "global" one. It is the next:

$result = call_user_func_array(array($$object_123456789, $method), $arguments);

The problem here is that the function is being called indirectly by using the "call_user_func_array" function.

A solution would be transforming all arguments into references. Suggestion:

foreach ($arguments as $count => $value)
{
    $param = 'param' . $count;
    $$param = $value;
    $arguments[$count] = &$$param;
}

Put the code above in the beginning of the call function, right after the following line:

$id = serialize($arguments);

Give this a try!