Asymmetric visibility, and the setter I deleted

A property that everything reads and only the class writes had needed a private property, a public getter and no setter — three declarations for one idea.

// 8.3
final class Basket
{
    private array $lines = [];

    public function lines(): array { return $this->lines; }
}

// 8.4
final class Basket
{
    public private(set) array $lines = [];
}

// read as $basket->lines, written only from inside.
// protected(set) exists too, for a hierarchy.

This removes the most common reason a class has getters at all, and it does not remove the reason to have a method: anything computed, anything that can fail, anything expensive still wants to be a call. Returning an array by property also gives away a copy rather than a reference, so the encapsulation holds — which is not obvious and is worth checking before converting a collection property.