Every class constant has been public since constants existed, so an internal lookup table intended as an implementation detail was part of the public API whether or not anyone documented it that way.
final class ShippingZone
{
public const DOMESTIC = 'domestic';
private const RATE_TABLE = [
'domestic' => 490,
'eu' => 1290,
];
}
The interesting part is not hiding the table; it is that the compiler now stops anyone depending on it, so it can change without a major version. Interface constants remain implicitly public and cannot be given visibility, which is consistent and occasionally surprising. Marking the deliberately public ones public explicitly is worth doing at the same time — the keyword now means something.