C'est pourtant simple. Le mot clé self donne accès à toutes les propriétés de la classe elle-même, à savoir les constantes, toutes les variables statiques (on pourraît dire communes à tous les objets, mais en réalité, cela signifie propriétés de la classe), ou méthodes statiques. Typiquement on dira que les méthodes et attributs statiques, appelés par self, s'appliquent à la classe elle même.
$this s'applique à l'objet lui même, à avoir que chaque objet va avoir ses propres données, et les méthodes qui y accèderont traiteront les données de cet objet spécifiquement. Quand on avec appellera $this, on se placera dans un contexte objet, c'est à dire que la méthode que l'on appelle travaille sur l'objet.
Elle est là la grosse subtilité, il faut savoir faire la part entre les deux, à savoir que dans un contexte objet (dans une méthode non statique), on a accès aux données d'un enregistrement, mais aussi, via le mot clé self, aux entités de la classe, parce que l'objet appartient à une classe. Lorsque l'on est dans une méthode statique, on n'a plus accès au contexte objet (donc au mot clé $this), puisque le contexte courant n'est plus associé à un objet précis, mais à la classe elle même.
Donc les méthodes __construct, et la majorité des méthodes magiques, ne servent qu'en contexte objet, mais le contexte objet ne sert pas qu'à cela, puisque toute méthode qui n'est pas déclarée static est en réalité une méthode d'objet, exécutée donc dans un contexte objet.
Quant à __autoload, c'est une fonction, non une méthode, elle n'a donc rien à voir avec notre réflexion courante...