Rozbudowa naszego modelu o metodę all, za pomocą której dostaniemy wszystkie elementy. Do dzieła.

Nie będzie to szczególnie trudne:

class PersonModel extends Model {

    protected static $tablename = 'people';
    protected static $keys = ['name', 'age'];

    public static function insert($data){
        $table = self::$tablename;
        $keys = static::keysString();
        $vals = static::valuesString();
        $query = "INSERT INTO {$table} {$keys} VALUES {$vals}";
        $stmt = static::$conn->prepare($query);   
        return $stmt->execute($data);
    }

    public static function all(){
        $table = self::$tablename;
        $query = "SELECT * FROM $table";
        $stmt = static::$conn->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
}

A oto efekt:

$person = new PersonModel();
$person->setConn($conn);
$result = $person::all();

foreach( $result as $row ) {
    echo $row->name;
    echo "<br>";
    echo $row->age;
    echo "<br>";
}

Możemy jeszcze dodać obsługę typów:

class PersonModel extends Model {

    //(...)

    public static function all($type=PDO::FETCH_OBJ){
        $table = self::$tablename;
        $query = "SELECT * FROM $table";
        $stmt = static::$conn->prepare($query);
        $stmt->execute();
        return $stmt->fetchAll($type);
    }
}

$person = new PersonModel();
$person->setConn($conn);
$result = $person::all(PDO::FETCH_ASSOC);

foreach( $result as $row ) {
    echo $row['name'];
    echo "<br>";
    echo $row['age'];
    echo "<br>";
}

Żeby działało idealnie jak w Laravelu to będziemy musieli jeszcze co najmniej jedną warstwę abstrakcji dodać, ale na razie dopiero się rozkręcamy.