OOP PHP best practices
protected $people = array();

public function __construct() {
    $this-&gt;people = $people;


This may not be doing what you want.  After doing that, I would expect $this-&gt;people to equal null, as you just overwrote the previous value of array() with the value of a previously undeclared variable.  

                $this-&gt;people[] = $new_person;


Which makes that line create an array the first time that it is reached.  

$this-&gt;model = $options['model_type'];
$this-&gt;type = $options['post_type'];


This is bad style.  You should always declare class properties before using them so that you can give them the proper scope.  This also makes them quicker to access (it checks for declared variables first).  

                $new_person = new Person( $person-&gt;ID, $person-&gt;post_title, get_post_meta($person-&gt;ID, '_email_address', true) );


This looks suspicious to me.  Is the post title really a person's name?  If so, you should comment and explain why this would be true.  Otherwise, someone will later create a bunch of posts whose titles aren't people and wonder why posts are showing up under a list of people.  

Alternately, if post titles are not names of people, then this type is misnamed.  

You also might want to consider extending your class rather than using a switch in get_people.  Then you could have a People class and a Post class, and each could define its own get_people.