Второй параметр bindParam - это переменная reference .Поскольку на функцию return нельзя ссылаться, она не в состоянии строго удовлетворить потребности параметра bindParam (хотя PHP будет работать с вами и только выдаст здесь предупреждение).
Чтобы получить лучшее представление, вот пример: этот код даст те же результаты, что и ваш второй пример:
$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color");
$tempColor = NULL; // assigned here
$stmt->bindParam(':color',$tempColor);
$tempColor = $someClass->getColor(); // but reassigned here
$stmt->execute();
Это невозможно при возврате функции.