Los métodos mágicos set, get trabajan de forma similar al método mágico call, si recordamos un poco el método call nos permite alterar el comportamiento al invocar un método inexistente o privado de nuestro objeto. Pues el método get realiza la misma función, salvo que en vez de dispararse al invocar métodos se dispara al consultar atributos, a parte de poder ejecutar rutinas en el objeto, al ser llamado puede devolver el valor que nosotros queramos. Por ejemplo:

<?php 

class MiClase { 
    public $miAtributo = 'Atributo Publico'; 
    private $_miAtributoPrivado = 'Atributo Privado'; 
    private $_errores = 0; 
    public function __get( $atributo ){ 
        $this->_errores++; //Incrementamos el contador de errores 
        return '¡Error numero ' . $this->_errores . '! -> Atributo: ' . $atributo; 
    } 
} 

$clase = new MiClase(); 
echo $clase->miAtributo; //Imprime: Atributo Publico 
echo $clase->inexistente; //Imprime: ¡Error numero 1! -> Atributo: inexistente 
echo $clase->_miAtributoPrivado; //Imprime: ¡Error numero 2! -> Atributo: _miAtributoPrivado 
?>

¿Que utilidad tiene? Pues por ejemplo devolver el valor contenido en un array mediante su llave:

<?php 
class MiClase { 
    private $_datos = array( 'uno' => 'numero uno', 'dos' => 'numero dos' ); 
    public function __get( $atributo ){ 
        if( isset( $this->_datos[$atributo] ) ){ 
            return $this->_datos[$atributo]; 
        }else{ 
            return 'No existe.'; 
        } 
    } 
} 

$clase = new MiClase(); 
echo $clase->uno; //Imprime: numero uno 
echo $clase->dos; //Imprime: numero dos 
echo $clase->tres; //Imprime: No existe. 
?>

Lo bueno de get es que solo nos permite recibir, nunca alterar directamente un atributo, de esta forma podemos definir exactamente que es lo que deseamos sin romper la encapsulación del objeto. Si quisiéramos definir o alterar un atributo que no es accesible debemos de usar el método set. Este método mágico se dispara de la misma forma que get pero cuando intentamos escribir sobre un atributo, salvo que set recibe dos parámetros, el nombre del atributo y el valor que se le intenta dar:

<?php 
class MiClase { 
    private $_datos = array( 'uno' => 'numero uno', 'dos' => 'numero dos' ); 
    public function __get( $atributo ){ 
        if( isset( $this->_datos[$atributo] ) ){ 
            return $this->_datos[$atributo]; 
        }else{ 
            return 'No existe.'; 
        } 
    } 

    public function __set( $atributo, $argumento ){ 
        echo 'No tienes permiso para escribir. -> Atributo: ' . $atributo . ' = ' . $argumento; 
    } 
} 

$clase = new MiClase(); 
echo $clase->uno; //Imprime: numero uno 
$clase->uno = 'Mi string'; //Imprime: No tienes permiso para escribir. -> Atributo: uno = Mi string 
?>

Aunque usar get y set conjuntamente permitiendo acceder a atributos privados o crearlos va en contra de la encapsulación (regla primordial para usar objetos) estos métodos puede tener muchos otros usos, como un sistema de logs o seguridad, etcétera.