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;
?>ReflectionClass::newLazyGhost
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
ReflectionClass::newLazyGhost
Референца за `reflectionclass.newlazyghost.php` со подобрена типографија и навигација.
ReflectionClass::newLazyGhost
Класата Dom\DtdNamedNodeMap
ReflectionClass::newLazyGhost — Создава нова мрзлива инстанца на дух
= NULL
Создава нова мрзлива инстанца на дух од класата, прикачувајќи го
initializer на него. Конструкторот не се повикува, а својствата не се поставуваат на нивната стандардна вредност. Сепак, објектот автоматски ќе се иницијализира со повикување на
initializer првпат кога неговата состојба ќе се забележи или измени. Види
Предизвикувачи на иницијализација and
Секвенца на иницијализација.
Параметри
initializer-
Иницијализаторот е повратен повик со следниот потпис:
object-
На
objectсе иницијализира. Во овој момент, објектот повеќе не е означен како мрзлив, а пристапот до него не предизвикува повторно иницијализирање.
initializerфункцијата мора да вратиnullили никаква вредност. options-
optionsПовик за фабрика со ист потпис и цел како во-
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE - може да биде комбинација од следниве знаменца:
-
Вратени вредности
Враќа мрзлива инстанца на дух. Ако објектот нема својства, или ако сите негови својства се статични или виртуелни, се враќа нормална (не-мрзлива) инстанца. Види исто така Животен циклус на мрзливи објекти.
Errors/Exceptions
Еден Грешка ако класата е внатрешна или ја проширува внатрешната класа освен stdClass.
Примери
Пример #1 Основна употреба
<?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);
// Triggers initialization, and fetches the property after that
var_dump($object->prop);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
lazy ghost object(Example)#3 (0) {
["prop"]=>
uninitialized(int)
}
bool(true)
Example::__construct
int(1)
Види Исто така
- Објектот на кој треба да се означи својството.
- ReflectionClass::newLazyGhost() ако објектот се иницијализира, или ако својствата на објектот се итерираат со
- (PHP 5 >= 5.1.3, PHP 7, PHP 8) - Создава нова инстанца на класа без повикување на конструкторот
- Мрзливиот објект е објект чија иницијализација се одложува додека неговата состојба не се набљудува или менува. Некои примери за употреба вклучуваат компоненти за инјектирање зависности кои обезбедуваат мрзливи услуги целосно иницијализирани само доколку е потребно, - Создава нова мрзлива прокси инстанца
- ReflectionClass::initializeLazyObject() - Означува мрзлив објект како иницијализиран без повикување на иницијализаторот или фабриката
- ReflectionClass::resetAsLazyProxy() - Присилува иницијализација на мрзлив објект
- (PHP 8 >= 8.4.0) - Проверува дали објект е мрзлив и неиницијализиран
- ReflectionProperty::skipLazyInitialization() Мрзливи објекти
- Пример #3 Иницијализирање својства однапред - Го означува својството како не-мрзливо
- ReflectionProperty::isLazy() - Проверува дали својство е мрзливо