<?php
/**
* @property stdClass $x
* @property stdClass $y
*/
class C {
private $buffer = array();
function __get($key) {
if (array_key_exists($key, $this->buffer)) {
return $this->buffer[$key];
}
$f = 'calc_' . $key;
return $this->buffer[$key] = $this->$f();
}
function calc_x() {print __METHOD__ . "\n";
$x = new stdClass;
$x->y = $this->__get('y');
return $x;
}
function calc_y() {print __METHOD__ . "\n";
$y = new stdClass;
// Set a stub to avoid infinite recursion.
$this->buffer['y'] = $y;
$y->x = $this->__get('x');
return $y;
}
}
$c = new C;
$x = $c->x;
$y = $c->y;
var_dump($x->y === $y, $y->x === $x);
print "\n";
$c = new C;
$y = $c->y;
$x = $c->x;
var_dump($x->y === $y, $y->x === $x);
- Output for 5.5.24 - 5.5.35, 5.6.8 - 5.6.28, 7.0.0 - 7.0.20, 7.1.0 - 7.1.20, 7.2.0 - 7.2.33, 7.3.16 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.17, 8.3.0 - 8.3.4
- C::calc_x
C::calc_y
C::calc_x
bool(true)
bool(false)
C::calc_y
C::calc_x
bool(true)
bool(true)
preferences:
155.23 ms | 404 KiB | 179 Q