ReflectionClass::newLazyGhost

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyGhostCrear una nueva instancia fantasma perezosa

Descripción

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

Crear una nueva instancia fantasma perezosa de la clase, adjuntando el initializer a esta. El constructor no es llamado, y las propiedades no son definidas a su valor por defecto. Sin embargo, el objeto será automáticamente inicializado invocando el initializer la primera vez que su estado es observado o modificado. Ver disparadores de inicialización y secuencia de inicialización.

Parámetros

initializer
El inicializador es una función de retrollamada con la siguiente firma:

initializer(object $object): void
object
El object en curso de inicialización. En este punto, el objeto ya no está marcado como perezoso, y acceder a él no desencadena la inicialización.

La función initializer debe devolver null o no devolver nada.
options

options puede ser una combinación de los siguientes flags:

ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
Por omisión, la serialización de un objeto perezoso desencadena su inicialización. Definir este flag evita la inicialización, permitiendo que los objetos perezosos sean serializados sin ser inicializados.

Valores devueltos

Devolver una instancia fantasma perezosa. Si el objeto no tiene propiedades, o si todas sus propiedades son estáticas o virtuales, se devuelve una instancia normal (no perezosa). Ver también Ciclo de vida de los objetos perezosos.

Errores/Excepciones

Una ReflectionException si la clase es interna o extiende una clase interna, excepto stdClass.

Ejemplos

Ejemplo #1 Uso básico

<?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);

// Desencadena la inicialización, y obtiene la propiedad después de esto
var_dump($object->prop);

?>

El resultado del ejemplo sería:

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

Ver también

add a note

User Contributed Notes 1 note

up
1
dave1010 at gmail dot com
7 months 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