You are using PHP7.
Firstly, note that $nodes
in the statement $result = $node->$nodes[$i] = $value
is a variable variable. The problematic part of the statement is $node->$nodes[$i]
itself.
As specified in the PHP7 documention for Backward Incompatible Changes, a number of changes have been made to variable handling, including Changes to the handling of indirect variables, properties, and methods.
This states that:
Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluation has changed.
The documentation provides a few examples where expected behaviour has changed. So what has changed in this case?
- In previous versions,
$node->$nodes[$i]
is evaluated as$node->{$nodes[$i]}
. - In PHP7,
$node->$nodes[$i]
is evaluated as($node->$nodes)[$i]
.
To illustrate with a quick example:
<?php
// create a class
$node = new stdClass();
// add some public properties
$node->foo = 'I am foo!';
$node->bar = 'I am bar!';
// declare an array of `node` names
$nodes = ['foo', 'bar'];
$i = 0;
echo $node->$nodes[$i];
Working example showing behaviour in different versions of PHP.
Prior to PHP7, $nodes[$i]
is evaulated first which is is $nodes[0]
. This yields the string foo
. Then, thanks to some "variable variable" magic, this is evaluated as $nodes->foo
. Which, of course, is an existing property with a string
value I am foo!
.
IN PHP7, because of the documented changes in evaluation, $node->$nodes
is evaluated first. What is $nodes
? It's an array
, not a string
, so cannot be used to dereference a property. Hence the displayed Array to string
notice.
This appears to be a known issue in Joomla. It looks like some work has gone into resolving this.
Your options here are to:
- Use a previous version of PHP.
- Explore if there is a more recent version of Joomla to which you can upgrade that has fixed this issue.
Hope this helps :)