update page now
Laravel Live Japan

ReflectionClass::newLazyGhost

(PHP 8 >= 8.4.0)

ReflectionClass::newLazyGhostCria uma nova instância de fantasma lento

Descrição

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

Cria uma nova instância fantasma lenta da classe, anexando o initializer a ela. O construtor não é chamado e as propriedades não são definidas com seus valores padrão. Entretanto, o objeto será inicializado automaticamente invocando o initializer na primeira vez que seu estado for observado ou modificado. Consulte Gatilhos de Inicialização e Sequência de Inicialização .

Parâmetros

initializer
O inicializador é uma função de retorno com a seguinte assinatura:

initializer(object $object): void
object
O parâmetro object informa o objeto que está sendo inicializado. Neste ponto, o objeto não está mais marcado como lento e acessá-lo não aciona a inicialização novamente.

A função initializer deve retornar null ou nenhum valor.
options

options pode ser uma combinação das seguintes opções:

ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
Por padrão, a serialização de um objeto lento aciona sua inicialização. Definir essa opção impede a inicialização, permitindo que objetos lentos sejam serializados sem serem inicializados.

Valor Retornado

Retorna uma instância de fantasma lento. Se o objeto não tiver propriedades ou se todas as suas propriedades forem estáticas ou virtuais, uma instância normal (não-lenta) será retornada. Veja também Ciclo de Vida de Objetos Lentos.

Erros/Exceções

Um Error se a classe for interna ou estender uma classe interna exceto stdClass.

Exemplos

Exemplo #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);

// Aciona a inicialização e busca a propriedade depois disso
var_dump($object->prop);

?>

O exemplo acima produzirá:

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

Veja Também

adicionar nota

Notas de Usuários 1 note

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