A constructor can provide defaults so object creation stays convenient.

Constructor Defaults

constructor_defaults.php
<?php
class ShippingBox
{
    public function __construct(private int $weight = 1)
    {
    }

    public function cost(int $rate): int
    {
        return $this->weight * $rate;
    }
}

$rate = ;
$defaultCost = (new ShippingBox())->cost($rate);
$heavyCost = (new ShippingBox(3))->cost($rate);

echo "rate=" . $rate . "\n";
echo "defaultCost=" . $defaultCost . "\n";
echo "heavyCost=" . $heavyCost . "\n";
<?php
class ShippingBox
{
    public function __construct(private int $weight = 1)
    {
    }

    public function cost(int $rate): int
    {
        return $this->weight * $rate;
    }
}

$rate = ;
$defaultCost = (new ShippingBox())->cost($rate);
$heavyCost = (new ShippingBox(3))->cost($rate);

echo "rate=" . $rate . "\n";
echo "defaultCost=" . $defaultCost . "\n";
echo "heavyCost=" . $heavyCost . "\n";
<?php
class ShippingBox
{
    public function __construct(private int $weight = 1)
    {
    }

    public function cost(int $rate): int
    {
        return $this->weight * $rate;
    }
}

$rate = ;
$defaultCost = (new ShippingBox())->cost($rate);
$heavyCost = (new ShippingBox(3))->cost($rate);

echo "rate=" . $rate . "\n";
echo "defaultCost=" . $defaultCost . "\n";
echo "heavyCost=" . $heavyCost . "\n";
optional constructor input Default constructor values let a class support both explicit and ordinary setup.