<?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() {
$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($object) {
$object->bar = 'Loaded from DB!';
}, null, get_parent_class($this))->__invoke($this);
var_dump(get_parent_class($this));
return $this->$name;
}
}
var_dump((new ClassicLazyFoo())->getBar());
var_dump((new LazyPropertyLazyFoo())->getBar());
string(15) "Loaded from DB!"
string(3) "Foo"
Warning: Undefined property: LazyPropertyLazyFoo::$bar in /in/1Ucab on line 54
NULL
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
string(15) "Loaded from DB!"
string(3) "Foo"
Warning: Undefined property: LazyPropertyLazyFoo::$bar in /in/1Ucab on line 54
NULL
string(15) "Loaded from DB!"
string(3) "Foo"
Notice: Undefined property: LazyPropertyLazyFoo::$bar in /in/1Ucab on line 54
NULL
Output for 7.3.32 - 7.3.33
string(15) "Loaded from DB!"
string(3) "Foo"
NULL
Output for 5.4.0 - 5.4.11
string(15) "Loaded from DB!"
string(3) "Foo"
string(3) "Foo"
Notice: Undefined property: LazyPropertyLazyFoo::$bar in /in/1Ucab on line 54
NULL
Output for 5.3.0 - 5.3.29
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /in/1Ucab on line 59
Process exited with code 255.
Output for 5.1.0 - 5.1.6, 5.2.0 - 5.2.17
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/1Ucab on line 30
Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in /in/1Ucab on line 30
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /in/1Ucab on line 30
Parse error: parse error, unexpected T_FUNCTION, expecting ')' in /in/1Ucab on line 30
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/1Ucab on line 6
Process exited with code 255.
Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /in/1Ucab on line 6
Process exited with code 255.
Output for 4.3.2 - 4.3.4
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in /in/1Ucab on line 6
Process exited with code 255.