empty() precisa acessar o valor por referência (para verificar se essa referência aponta para algo que existe), e o PHP anterior ao 5.5 não suportava referências a valores temporários retornados de funções.
No entanto, o verdadeiro problema que você tem é que você usa empty(), acreditando equivocadamente que o valor "vazio" é diferente de "falso".
Vazio é apenas um apelido para !isset($thing) || !$thing. Quando a coisa que você está verificando sempre existe (nos resultados PHP das chamadas de função sempre existem), a empty()função não passa de um operador de negação .
PHP não tem conceito de vazio . Valores que avaliam como falso estão vazios, valores que avaliam como verdadeiro são não vazios. É a mesma coisa. Este código:
$x = something();
if (empty($x)) …
e isto:
$x = something();
if (!$x) …
sempre tem o mesmo resultado, em todos os casos, para todos os tipos de dados (porque $xdefinido empty()é redundante).
O valor de retorno do método sempre existe (mesmo que você não tenha uma returninstrução, o valor de retorno existe e contém null). Portanto:
if (!empty($r->getError()))
é logicamente equivalente a:
if ($r->getError())
empty: wiki.php.net/rfc/empty_isset_exprs