The use of entities/value objects clearly defines what a method expects to receive, and it also makes it easier to utilize the passed values inside the method.
public function test(array $user, etc.)
In this case, the array user is supposed to contain 'username, ‘firstname’, ‘lastname’ etc.
However, you do not have any control over if the array actually contain those values when passed to the method.
public function test(string $username, string $firstName, string $lastName, etc.)
A better method could be, something similar to this. However, this can make for a long parameter list for the method.
public function test(Value\User $user)
By passing along an entity of the user, you are certain that it contains the values you need. If it did not the code would have failed earlier. To get the values you would call, $user->getUsername(), $user->getFirstName() etc.
Basically, by utilizing immutable entities (value objects with a state, i.e. user, transaction etc.) and value objects, you significantly cut down on the possible errors that can happen due to wrong information is passed along to methods/classes.
There is a bunch of articles about this, though I recommend you take a look at this talk by Gordon Skinner on domain driven development. He has a straight forward explanation about entities/value objects and why they make sense code wise.
Forgot to attach the link.