Validating a model that requires database access
Best approach would be to have another Object to do the validation based on specific configuration.

Your User should NOT be responsible for validating itself, neither should the DAO.
Validation is a specific task and should be handled by a specific Class.

Example of this approach would be something like this (omitiong interfaces for brevity):

validation class

Class Validator 
{
   protected $errors = [];

   public function __construct(DaoInterface $daoDependency, $otherDependency)
   {
      //...
   }

   public function validate($object, array $rules) 
   {
       foreach ($rules as $rule)
       {
           $propertyName = $rule['property'];
           if (!$this-&gt;isValidateProperty($object, $propertyName, $rule['config'])) {
               $this-&gt;errors[$object-&gt;$propertyName] = 'is invalid ' . $rule['message'];
           }
       }
   }

   public function isValid()
   {
       return (bool)count($this-&gt;errors);
   }

   public function getErrors()
   {
       return $this-&gt;errors;
   }

   protected function isValidProperty($object, $propertyName, $ruleConfig)
   {
       // $ruleConfig should have information about what validation you want to use and relevant validation should be executed base on it (it can separate objects etc)
       if (!property_exists($object, $propertyName)
          throw new MissingPropertyException();


       if (isset($ruleConfig['email-unique-in-db') {
           if ($daoDependecny-&gt;emailExists($object-&gt;$propertyName) {
               return false;
           }
       }
       if (isset($ruleConfig['email-is-valid') {
           return (bool)strpos($object-&gt;$propertyName, '@');               
       }
       // ... etc but better with objects for each validation type.
   }
}


usage

$userDAO = new UserDAO($dbh, $logger);
$user = new User();
$user-&gt;email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$user-&gt;password = filter_input(INPUT_POST, 'password');

// get your validation rules
// you can have them stored in other object, plain array, yml whatever you like. for instance $rules = new UserConstrains(); or
$rules['config] = [
  'email' =&gt; [
      'email-unique-in-db',
      'email-is-valid'
  ],
  'otherfield' =&gt; [
      'callback' =&gt; ['someCallbackFunction']
  ]
];

// create validator
$validator = new Validator($userDao, $otherDepenency);
$validator-&gt;validate($user, $rules);
// validate user

if (validator-&gt;isValid()) {
   // .. do stuff
} else {
   // do something with $user-&gt;errors
}


The separation of concerns is the most important thing here.
You can extend/decorate the validator class for specific use cases

Also if would recommend using some specialized validation library for this task for instance symfony2 validation component can be used stand alone: http://symfony.com/doc/current/book/validation.html