PSV have 30 points after 12 matches, one ahead of long-time leaders Twente Enschede, who dropped to second after being held 0-0 by third-placed Vitesse Arnhem.
Daniel de Ridder headed home the opener for Heerenveen in the sixth minute after the Eindhoven defence failed to clear a throw-in but midway through the first half Luciano Narsingh equalised for the home team.
Seven minutes after the break, Dries Mertens put PSV ahead with a superb curled drive from 17 metres followed by Georginio Wijnaldum's close-range header. Tim Matavz added two more goals in the final 10 minutes.
"It looks like an easy win but it wasn't like that," PSV skipper Mark van Bommel, who returned after missing four matches through injury, told Eredivisie Live TV.
"We had to come from behind but an advantage was that it happened early in the match."
Twente had been top of the table from the start of the season until the stalemate at Vitesse, who have won all six away matches so far but failed to impress at home with only victory from six.
"Our defensive organisation was perfect to control Vitesse's key strikers (Wilfried) Bony and (Jonathan) Reis but we failed in possession and therefore we never came close to a win," Twente manager Steve McClaren told reporters.
Danish teenager Viktor Fischer struck as Ajax Amsterdam won 4-2 at strugglers PEC Zwolle, but they lost striker Ryan Babel after six minutes with a dislocated shoulder.
Ajax are fourth in the league with 21 points and ahead on goal difference from arch-rivals Feyenoord, 5-2 winners over Roda JC Kerkrade, and Utrecht, who slumped to a 4-0 defeat at RKC Waalwijk on Saturday.
Italian striker Graziano Pelle handed Feyenoord a perfect start when he fired the ball into the top corner after 20 seconds and added a second goal before the break to lift his total for the season to six.