Assigning to an undeclared property has silently created one since PHP 4, which means every typo in a property name has been a working assignment to the wrong thing.
class Order
{
public int $total = 0;
}
$order = new Order();
$order->totl = 500;
// 8.1: creates a property. no notice. $order->total is 0.
// 8.2: Deprecated: Creation of dynamic property
// Order::$totl is deprecated
// 9.0: Error
The deprecation is the whole value — the runtime behaviour is unchanged and the notice is the first time the engine has ever objected. Classes extending stdClass, and stdClass itself, are unaffected, as are classes implementing __get and __set, which covers most of the legitimate uses. Promoting the notice to an exception in the test environment is how the remaining ones get found before 9.0.