3v4l.org

run code in 300+ PHP versions simultaneously
<?php final readonly class Product { public function __construct( public string $id, public string $name, public string $description, public int $price = 10, ) { } } final class Cart { /** * @param Product[] $products */ public function __construct( public string $id, public array $products = [], public int $total = 0, public int $quantity = 0, ) { } public function addProduct(Product $product): void { $this->products[] = $product; $this->quantity++; $this->total += $product->price; } } final readonly class ProductRepository { public function find(string $id): Product { // Simulate loading from database return new Product($id, "product-$id", "description-$id"); } public function findByIds(array $ids): array { // Simulate loading from database $products = []; foreach ($ids as $id) { $products[] = $this->find($id); } return $products; } } final readonly class CartRepository { private ReflectionClass $reflector; public function __construct( private ProductRepository $productRepository, ) { $this->reflector = new ReflectionClass(Cart::class); } public function serialize(Cart $cart): string { return json_encode([ 'id' => $cart->id, 'products' => array_column($cart->products, 'id'), 'total' => $cart->total, 'quantity' => $cart->quantity, ]); } public function unserialize(string $data): Cart { var_dump('...Unserializing cart...'); $previousCart = json_decode($data, true); $newCart = $this->reflector->newLazyGhost(function(Cart $newCart) use ($previousCart): void { var_dump('...Loading products...'); $products = $this->productRepository->findByIds($previousCart['products']); $this->reflector->getProperty('products')->setValue($newCart, $products); }); $this->reflector->getProperty('id')->setRawValueWithoutLazyInitialization($newCart, $previousCart['id']); $this->reflector->getProperty('total')->setRawValueWithoutLazyInitialization($newCart, $previousCart['total']); $this->reflector->getProperty('quantity')->setRawValueWithoutLazyInitialization($newCart, $previousCart['quantity']); return $newCart; } } $productRepository = new ProductRepository(); $repository = new CartRepository($productRepository); $cart = new Cart('#cart-01'); $cart->addProduct($productRepository->find('1')); $cart->addProduct($productRepository->find('2')); $cart->addProduct($productRepository->find('3')); // Usually, the $serialized string would be stored in a database or in the // session $serialized = $repository->serialize($cart); // A new HTTP request is made and the $serialized string is retrieved from the // DB or the sessions $newCart = $repository->unserialize($serialized); var_dump($newCart); var_dump($newCart->total); $newCart->products; var_dump($newCart);

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.10.0140.00916.76
8.5.00.0160.00619.98
8.4.160.0130.01024.00
8.4.150.0020.00114.05
8.4.140.0170.00817.51
8.4.130.0060.00317.41
8.4.120.0140.00720.71
8.4.110.0130.00422.36
8.4.100.0110.01117.93
8.4.90.0100.01117.86
8.4.80.0120.00819.63
8.4.70.0030.00619.66
8.4.60.0140.00718.54
8.4.50.0080.01220.55
8.4.40.0120.00917.80
8.4.30.0160.00320.26
8.4.20.0170.00319.29
8.4.10.0090.00019.38
8.3.280.0120.00920.21
8.3.270.0110.00816.66
8.3.260.0100.00616.72
8.3.250.0080.01118.84
8.3.240.0110.00816.72
8.3.230.0040.00416.61
8.3.220.0080.01116.73
8.3.210.0100.00816.70
8.3.200.0060.00316.54
8.3.190.0090.00917.11
8.3.180.0110.00916.83
8.3.170.0130.00617.31
8.3.160.0110.00719.22
8.3.150.0120.00617.05
8.3.140.0120.00316.94
8.3.130.0120.00618.72
8.3.120.0080.00416.83
8.3.110.0090.00016.91
8.3.50.0040.00716.54
8.2.290.0130.00619.15
8.2.280.0090.01018.66
8.2.270.0100.01016.61
8.2.260.0110.00717.25
8.2.250.0070.01316.87
8.2.240.0080.00016.86
8.2.230.0000.00916.82
8.1.330.0070.01116.58
8.1.320.0090.00317.69
8.1.310.0000.01716.68
8.1.300.0040.00416.05

preferences:
64.07 ms | 403 KiB | 5 Q