McCann’s two-run shot gave the Braves a 4-2 lead two batters after Justin Upton tied it on an RBI single. Johnson’s seventh homer gave the Braves a 5-2 lead.
Johnson extended his hitting streak to 11 with his solo shot. He also had a seventh-inning double to extend his streak of multihit games to eight.
It is the most for any Braves player since the franchise moved to Atlanta in 1966.
Kris Medlen (8-10) earned the victory, going six innings while giving up six hits and four runs, including three solo homers. He struck out eight and walked one.
Darin Ruf, Delmon Young and Chase Utley homered for Philadelphia, which has lost 11 of 13 since the All-Star break.
David Carpenter struck out the Philadelphia side in the seventh, Jordan Walden fanned two in the eighth and Craig Kimbrel got two in the ninth for his NL-best 32nd save.
In his major-league debut, Ethan Martin (0-1) allowed six runs and eight hits.
Ruf gave the Phillies a 1-0 lead in the second inning when he sent a full-count fastball into the left-field bleachers. On the next pitch, Delmon Young hit one out to right to make it 2-0.
Jason Heyward got the Braves on the board with an RBI single in the third.
Phillies manager Charlie Manuel and shortstop Jimmy Rollins were ejected in the ninth inning, arguing an apparent foul tip by Young that was called strike three.
NOTES: Ruf has reached base in 30 consecutive games, going back to last season – the longest active streak in the majors. He’s hit .310 over that span, with 15 of 31 hits going for extra bases. ... Over his 11-game hitting streak, Johnson has gone 21 for 44 and raised his average to .347. ... Philadelphia placed rookie RHP Jonathan Pettibone (5-4, 4.04 ERA) on the 15-day disabled list prior to the game with a right shoulder strain. The Phillies also designated RHP J.C. Ramirez for assignment and promoted RHP Zach Miner from Triple-A Lehigh Valley. ... Curt Schilling, who spent eight-plus seasons of his 20-year career with the Phillies, was inducted into the Philadelphia Baseball Wall of Fame prior to the game. ... Cliff Lee, scratched from his last start with a stiff neck, will take the mound Sunday for the Phillies.