El problema es probablemente que $this->phone
está vacío cuando ejecuta la consulta.
En ese caso, la consulta será SELECT * FROM [...] OR WHERE phone LIKE '%%'
que siempre devolverá todo.
Solución:omita los criterios del teléfono si no se proporcionan o (¡alerta de pirateo! ) use un valor que nunca aparecerá en esa columna.
Otra forma de hacer esto es cambiar la consulta a algo como
SELECT *
FROM directory
WHERE name LIKE :name
AND :name_provided = 1
OR phone LIKE :phone
AND :phone_provided = 1
Y luego enlazar :phone_provided
a 1 si $this->phone
está definido, 0 en caso contrario. Del mismo modo con :name_provided
.