Это называется переменная с переменным именем (
variable variable).
class Foo {
public $deepest = 'Limbo';
public function __toString()
{
return 'deep';
}
}
$deeper = 'deepest';
$deep = 'deeper';
$b = new Foo();
echo $b->$$$b;
Выражение выполняется справа налево:
1.
$b->$$($b) превращается в
$b->$$($b->__toString()), поскольку именно так ведут себя объекты, когда на них пытаются натравить
echo;
2.
$b->$$($b->__toString()) превращается в
$b->$(${'deep'}), именно это значение возвращает метод
__toString класса
Foo, инстансом которого является
$b;
3.
$b->$(${'deep'}) превращается в
$b->$($deep), это как раз вызов переменной при помощи значения из другой переменной;
4.
$b->$($deep) превращается в
$b->${'deeper'}, поскольку именно такое значение находится в переменной
$deep;
5.
$b->${'deeper'} превращается в
$b->($deeper);
6.
$b->($deeper) превращается в
$b->deepest;
7. наконец, получается значение свойства
'deepest' из
$b, а там как раз хранится
'Limbo', оно и выводится в
echo.