- var_dump: documentation ( source)
- get_parent_class: documentation ( source)
<?php
class Foo
{
private $bar = 'baz';
public function getBar()
{
return $this->bar;
}
}
// http://3v4l.org/pc6lo#v540
class ClassicLazyFoo extends Foo
{
private $initialized = false;
public function getBar()
{
$this->init();
return parent::getBar();
}
private function init()
{
if ($this->initialized) { return; }
\Closure::bind(function() {
var_dump('lazy loading!');
$this->bar = 'Loaded from DB!';
}, $this, get_parent_class($this))->__invoke();
}
}
// look ma: no method overrides!
class LazyPropertyLazyFoo extends Foo
{
public function __construct()
{
\Closure::bind(function() {
unset($this->bar);
}, $this, get_parent_class($this))->__invoke();
}
// note that other accessors also need to be created for full functional completeness
public function __get($name)
{
\Closure::bind(function() {
var_dump('lazy loading!');
$this->bar = 'Loaded from DB!';
}, $this, get_parent_class($this))->__invoke();
return \Closure::bind(function() use ($name) {
return $this->$name;
}, $this, get_parent_class($this))->__invoke();
}
}
var_dump('Trying classic lazy-loading via method overrides:');
$classic = new ClassicLazyFoo();
var_dump($classic->getBar());
var_dump($classic->getBar());
var_dump($classic->getBar());
var_dump('Trying lazy-loading via undefined properties:');
$lazyProperty = new LazyPropertyLazyFoo();
var_dump($lazyProperty->getBar());
var_dump($lazyProperty->getBar());
var_dump($lazyProperty->getBar());