Конструктор в PHP всегда будет возвращать void
. Это
public function __construct()
{
return FALSE;
}
не будет работать. Создание исключения в конструкторе
public function __construct($camperId)
{
if($camperId === 1) {
throw new Exception('ID 1 is not in database');
}
}
прервет выполнение скрипта, если вы не поймаете его где-нибудь
try {
$camper = new SummerCamper(1);
} catch(Exception $e) {
$camper = FALSE;
}
Вы можете переместить приведенный выше код в статический метод SummerCamper, чтобы создать его экземпляры, вместо использования ключевого слова new
(что часто встречается в Java, я слышал)
class SummerCamper
{
protected function __construct($camperId)
{
if($camperId === 1) {
throw new Exception('ID 1 is not in database');
}
}
public static function create($camperId)
{
$camper = FALSE;
try {
$camper = new self($camperId);
} catch(Exception $e) {
// uncomment if you want PHP to raise a Notice about it
// trigger_error($e->getMessage(), E_USER_NOTICE);
}
return $camper;
}
}
Таким образом, вы могли бы сделать
$camper = SummerCamper::create(1);
и получите FALSE
в $camper
, когда $camper_id
не существует. Поскольку статика считается вредной , вы можете использовать вместо нее Фабрику.
Другой вариант - полностью отделить доступ к базе данных от SummerCamper
. По сути, SummerCamper
- это сущность, которая должна заботиться только о SummerCamper
вещах. Если вы даете ему знания о том, как сохранить себя, вы фактически создаете ActiveRecord или RowDataGateway . Вы могли бы пойти с DataMapper подход:
class SummerCamperMapper
{
public function findById($id)
{
$camper = FALSE;
$data = $this->dbAdapter->query('SELECT id, name FROM campers where ?', $id);
if($data) {
$camper = new SummerCamper($data);
}
return $camper;
}
}
и ваша сущность
class SummerCamper
{
protected $id;
public function __construct(array $data)
{
$this->id = data['id'];
// other assignments
}
}
DataMapper несколько сложнее, но он дает вам разъединенный код, который, в конце концов, более удобен в обслуживании и гибок. Посмотрите вокруг, есть ряд вопросов по этим темам.