@Bas Just looked at your new code and it's a lot better. The only improvement I see is that $vehicleOwner already has vehicle inside. So just passing $vehicleOwner to parse($vehicleOwner) should be enough.
Inside parse() you can get the $vehicle object from $vehicleOwner
DeliveryVanDataParser depends on DataPropertyResolver. The point of Dependency Injection is to inject dependencies to objects that need it. It's not immediately obvious that DeliveryVanDataParser needs another class until you want to use it then the developer would have to include DataPropertyResolver. It's a pain, I shouldn't have to delve deep into a class just to use it only to find out I need something else.
class DataPropertyResolver { public function __construct(DataPropertyResolver $resolver) { } }
Would make it obvious what it needs in order to work.
class DeliveryVanDataParser { public function __construct(DataPropertyResolver $resolver) { } }
Whoops, I meant this one ^
Then if you don't want to specify the dependencies. Just use a factory to manage and inject the dependencies and return the built class with minimal effort.
That being said, I would get rid of PropertyResolver::resolveWeightClass() and move it to $vehicle->resolveWeightClass($data). $vehicle already knows or rather it should know it's own weight (property). So it should be able to resolve it's own weight class if you pass the $data into the function's argument. Then the code would be refactored better, one less dependency and it would make more sense IMO.
Basically $vehicle should know everything about itself. If it knows it's own weight, it should also know it's own weight class too I think :)