PHP Conference Nagoya 2025

ReflectionClass::newLazyGhost

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyGhostCréer une nouvelle instance fantôme paresseuse

Description

public ReflectionClass::newLazyGhost(callable $initializer, int $options = 0): object

Créer une nouvelle instance fantôme paresseuse de la classe, en attachant l'initializer à celle-ci. Le constructeur n'est pas appelé, et les propriétés ne sont pas définies à leur valeur par défaut. Cependant, l'objet sera automatiquement initialisé en invoquant l'initializer la première fois que son état est observé ou modifié. Voir déclencheurs d'initialisation et séquence d'initialisation.

Liste de paramètres

initializer
L'initialiseur est une fonction de rappel avec la signature suivante:

initializer(object $object): void
object
L'object en cours d'initialisation. À ce stade, l'objet n'est plus marqué comme paresseux, et y accéder ne déclenche plus l'initialisation.

La fonction initializer doit renvoyer null ou ne rien renvoyer.
options

options peut être une combinaison des drapeaux suivants:

ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
Par défaut, la sérialisation d'un objet paresseux déclenche son initialisation. Définir ce drapeau empêche l'initialisation, permettant aux objets paresseux d'être sérialisés sans être initialisés.

Valeurs de retour

Renvoyer une instance fantôme paresseuse. Si l'objet n'a pas de propriétés, ou si toutes ses propriétés sont statiques ou virtuelles, une instance normale (non paresseuse) est renvoyée. Voir aussi Cycle de vie des objets paresseux.

Erreurs / Exceptions

Une ReflectionException si la classe est interne ou étends une classe interne, sauf stdClass.

Exemples

Exemple #1 Utilisation basique

<?php

class Example {
public function
__construct(public int $prop) {
echo
__METHOD__, "\n";
}
}

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost(function (Example $object) {
$object->__construct(1);
});

var_dump($object);
var_dump($object instanceof Example);

// Déclenche l'initialisation, et récupère la propriété après cela
var_dump($object->prop);

?>

L'exemple ci-dessus va afficher :

lazy ghost object(Example)#3 (0) {
  ["prop"]=>
  uninitialized(int)
}
bool(true)
Example::__construct
int(1)

Voir aussi

add a note

User Contributed Notes 1 note

up
1
dave1010 at gmail dot com
8 days ago
Simple helper function that makes it easier to understand:

<?php

function createLazyGhost(
string $class,
?callable
$initializer = null,
?array
$propertySetterCallables = null
): object {
$reflection = new ReflectionClass($class);

return
$reflection->newLazyGhost(function (object $object) use ($initializer, $propertySetterCallables) {
// Initialize via the main initializer if provided
if ($initializer) {
$initializer($object);
}

// Set properties using the callables if provided
if ($propertySetterCallables) {
foreach (
$propertySetterCallables as $property => $callable) {
if (
is_callable($callable)) {
$object->$property = $callable();
}
}
}
});
}

?>

This supports using either a main object initializer and/or property initializers.

Here's an example, where generating order IDs and calculating totals is considered expensive, so we only do it when necessary:

<?php

class Order {
public
string $orderId = '';
public
float $total = 0.0;
}

$initializer = function (Order $order) {
$order->orderId = 'ORD12345';
};

$propertySetters = [
'total' => fn() => 200.75,
];

// Lazy ghost with both an initializer and property callables
$lazyOrder = createLazyGhost(Order::class, $initializer, $propertySetters);

// We can now use $lazyOrder as normal, even though the properties haven't been calculated yet.

// Do something that triggers initialization
echo $lazyOrder->orderId . PHP_EOL;
echo
$lazyOrder->total . PHP_EOL;

?>
To Top