Lookup class to get descriptions of values
Getting a distinct list from MySQL would slow things down quite a bit, I wouldn't do that. 

Perhaps you're overdoing it a bit? Yes, it is always good to filter user input, but I would do that at the point where this input arrives in your application, not in each class inside the application. You are already binding the parameters, which secures the database against injection. Anything apart from what's in your database will result in false, which might be better behaviour than throwing an exception.

So the protection is in the binding of the parameters, and not really in the validation. 

Talking about validation. There might be a perfectly good reason to insert all that code. Regretably your validation is incomplete. If I give your method a $lookup_value of 10 it will just return false. That might be a real value, or a sign that the value doesn't exist. You would normally use null in these cases, which is what you do when the query fails.

So my suggestions are: 


Filter user input, perhaps with static arrays, directly at the point
of entry. So at the point where you get user input out of $_POST,
$_GET, or anything else. Try to be as strict as possible. When a
value doesn't meet all the criteria, give feedback and allow the user
to enter a correct value. Never let an user freely enter values into
your application in the (false) assumption that the application will
deal with any abnormal values all by itself: It won't. You will
eventually make mistakes.
Keep the validation inside your application very simple and flexible,
this will make it easier to read, modify, and understand the code.
The validation is there to support you to debug your application, it
should not be relied upon as a security feature.
Always bind parameters, of course.


Something like this:

function getLookup($lookup_type,$lookup_name,$lookup_value)
{
  // checking type of arguments
  if (!(is_string($lookup_type) &amp;&amp;
        is_string($lookup_name) &amp;&amp;   
        is_int($lookup_value))) {
    throw new InvalidArgumentException('Invalid arguments in Lookup-&gt;getLookup().');
  }
  // select a description of ???
  $query = 'SELECT lookup_description 
            FROM Lookup 
            WHERE lookup_type  = :lookup_type AND 
                  lookup_name  = :lookup_name AND 
                  lookup_value = :lookup_value 
            LIMIT 1';
  try {
    $statement = $this-&gt;pdo-&gt;prepare($query);
    $statement-&gt;bindParam(':lookup_type', $lookup_type);
    $statement-&gt;bindParam(':lookup_name', $lookup_name);
    $statement-&gt;bindParam(':lookup_value',$lookup_value);
    $statement-&gt;execute();
    // return any results
    if ($statement-&gt;rowCount() &gt; 0) return $statement-&gt;fetchColumn();
  }
  catch (PDOException $exception) {
    error_log('Database error in Lookup-&gt;getLookup(): '.$exception-&gt;getMessage());
  }
  // failure: no results or database error
  return null;
}


While I was writing this code I noticed that you're using strange names in your database: A Lookup table, containing columns like lookup_name. From these names I get no idea what the content of that table is. The names describe the functions in PHP and not their meaning. A database should be comprehensible on its own, without any code operating on it.

PS: Perhaps someone told you to validate the arguments of your method thouroughly. I cannot help that, this happens when many people can give advise.