Gracias Casuis, tus comentarios y ejemplos me resultaron de mucha utilidad
Ahora te hago una pregunta sobre el último ejemplo, donde reescribís la clase Alumnos haciendo uso de los métodos mágicos _set y __get.
¿Te parece que ese esquema es útil solamente cuando no hay validación de los datos que se pasan?
Por ejemplo si quisiera asegurarme, dentro de la clase Alumno, que el valor que me pasan para "id" es un entero, y que los valores para "nombre" y "apellido" sean cadenas y no excedan los 50 caracteres.
¿Debería utilizar el primer esquema, es decir "function setNombre" y etc.?
¿O hay una manera elegante de resolverlo conservando los métodos mágicos?
Y en general: ¿es bueno poner validación de este tipo dentro de las clases o es signo de alguna mala práctica?