Passing Arrays

The problem with this approach is that the addUser method is only guaranteed to
receive an array of data. It could be passed an empty array, an array with typos for
its data (firstName -> first_name) or possibly even non-string values for its first
or last name indexes.

Placeholder Parameters

The first problem with this approach is when you start creating larger models the
exact position of each parameter becomes difficult to remember. PHP also doesn't
supported named parameters like other languages. Removing parameters later could also
break backwards compatibility.

PHP can't do type-checking on scalar values like strings either, so the service is
still responsible for validating that $firstName is a string and not an object or
something unusable.

Meet Contain

Contain aims to solve this problem by creating lightweight entity models that you pass
between services, controllers, views and just about anywhere else in your application: