--TEST-- Lazy objects: RFC example 004 --FILE-- 'Title', 'content' => 'Content', ]; } $reflector = new ReflectionClass(BlogPost::class); // Callable that retrieves the title and content from the database. $initializer = function ($blogPost) { var_dump("initialization"); $data = loadFromDB(); $blogPost->title = $data['title']; $blogPost->content = $data['content']; }; $post = $reflector->newLazyGhost($initializer); // Without this line, the following call to ReflectionProperty::setValue() would trigger initialization. $reflector->getProperty('id')->skipLazyInitialization($post); $reflector->getProperty('id')->setValue($post, 123); // Alternatively, one can use this directly: $reflector->getProperty('id')->setRawValueWithoutLazyInitialization($post, 123); var_dump($post); var_dump($post->id); var_dump($post->title); var_dump($post->content); var_dump($post); ?> ==DONE== --EXPECTF-- lazy ghost object(BlogPost)#%d (1) { ["id"]=> int(123) ["title"]=> uninitialized(string) ["content"]=> uninitialized(string) } int(123) string(14) "initialization" string(5) "Title" string(7) "Content" object(BlogPost)#%d (3) { ["id"]=> int(123) ["title"]=> string(5) "Title" ["content"]=> string(7) "Content" } ==DONE==