3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); // ─── Identity Package ───────────────────────────────────────────────────────── interface ContextResolver { public function resolve(): Context; } interface Context { } final readonly class IdentityContext implements Context { public function __construct( public readonly UserId $userId, public readonly TeamId $teamId, ) { } } final readonly class IdentityContextResolver implements ContextResolver { public function __construct( private Request $request, private JwtParser $jwt, ) { } public function resolve(): IdentityContext { $payload = $this->jwt->parse($this->request->bearerToken()); return new IdentityContext( userId: new UserId($payload->sub), teamId: new TeamId($payload->teamId), ); } } // ─── Payment Package ────────────────────────────────────────────────────────── final readonly class StripeActor { public function __construct( public readonly string $stripeEventId, public readonly string $stripeAccountId, ) { } } final readonly class PaymentContext implements Context { public function __construct( public readonly IdentityContext $identity, // composed public readonly StripeActor $actor, // composed ) { } } final readonly class PaymentContextResolver implements ContextResolver { public function __construct( private ContextResolver $inner, private Request $request, private StripeSignatureVerifier $verifier, ) { } public function resolve(): PaymentContext { $this->verifier->verify($this->request); $event = json_decode($this->request->getContent()); return new PaymentContext( identity: $this->inner->resolve(), actor: new StripeActor( stripeEventId: $event->id, stripeAccountId: $event->account, ), ); } } // ─── VoiceLead Package ──────────────────────────────────────────────────────── final readonly class VapiActor { public function __construct( public readonly string $botUuid, public readonly string $botId, ) { } } final readonly class VoiceLeadContext implements Context { public function __construct( public readonly IdentityContext $identity, // composed public readonly VapiActor $actor, // composed ) { } } final readonly class VoiceLeadContextResolver implements ContextResolver { public function __construct( private ContextResolver $inner, private Request $request, private HmacVerifier $verifier, private BotRepository $bots, ) { } public function resolve(): VoiceLeadContext { $this->verifier->verify($this->request); $botUuid = $this->request->input('botUuid'); $bot = $this->bots->findByUuid($botUuid); return new VoiceLeadContext( identity: $this->inner->resolve(), actor: new VapiActor( botUuid: $botUuid, botId: $bot->getId(), ), ); } } // ─── Controllers ────────────────────────────────────────────────────────────── final readonly class PaymentWebhookController { public function __construct( private PaymentContextResolver $resolver, ) { } public function __invoke(): void { $context = $this->resolver->resolve(); $context->identity->teamId; // from composed IdentityContext $context->actor->stripeEventId; // from composed StripeActor } } final readonly class VapiWebhookController { public function __construct( private VoiceLeadContextResolver $resolver, ) { } public function __invoke(): void { $context = $this->resolver->resolve(); $context->identity->teamId; // from composed IdentityContext $context->actor->botId; // from composed VapiActor } }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.5.30.0310.00717.28
8.5.20.0310.00916.73
8.5.10.0330.00716.73
8.5.00.0430.01116.73
8.4.180.0340.01119.55
8.4.170.0400.01419.64
8.4.160.0280.01319.31
8.4.150.0390.00719.45
8.4.140.0370.00517.42
8.4.130.0350.00917.52
8.4.120.0440.00717.48
8.4.110.0410.00717.67
8.4.100.0400.00917.27
8.4.90.0380.00917.54
8.4.80.0380.00817.70
8.4.70.0350.01117.57
8.4.60.0360.00817.83
8.4.50.0360.00817.70
8.4.40.0350.00917.57
8.4.30.0380.00917.21
8.4.20.0410.01117.44
8.4.10.0360.01117.32
8.3.300.0310.00818.38
8.3.290.0300.01118.30
8.3.280.0110.01218.30
8.3.270.0340.00816.81
8.3.260.0350.00816.73
8.3.250.0340.01016.73
8.3.240.0360.01016.73
8.3.230.0360.01116.73
8.3.220.0310.01416.77
8.3.210.0320.01116.77
8.3.200.0370.00716.73
8.3.190.0420.01016.73
8.3.180.0390.01016.73
8.3.170.0390.00816.73
8.3.160.0410.01016.73
8.3.150.0430.01216.73
8.3.140.0370.01616.73
8.3.130.0340.01016.73
8.3.120.0340.00816.73
8.3.110.0330.00816.73
8.3.100.0330.00716.73
8.3.90.0360.01016.73
8.3.80.0390.00716.73
8.3.70.0420.00716.73
8.3.60.0360.01416.73
8.3.50.0390.01016.73
8.3.40.0390.00917.82
8.3.30.0230.01317.73
8.3.20.0240.01117.91
8.3.10.0190.00917.57
8.3.00.0250.01117.76

preferences:
34.19 ms | 403 KiB | 5 Q