PHP-конструктор возвращает NULL
У меня есть этот код. Возможно ли, чтобы конструктор объектов User
каким-то образом вышел из строя, чтобы $this->LoggedUser
было назначено значение NULL
, и объект освобождается после возврата конструктора?
$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
$this->LoggedUser = new User($_SESSION['verbiste_user']);
Ответы
Ответ 1
Предполагая, что вы используете PHP 5, вы можете создать исключение в конструкторе:
class NotFoundException extends Exception {}
class User {
public function __construct($id) {
if (!$this->loadById($id)) {
throw new NotFoundException();
}
}
}
$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false) {
try {
$this->LoggedUser = new User($_SESSION['verbiste_user']);
} catch (NotFoundException $e) {}
}
Для ясности вы можете обернуть это статическим методом factory:
class User {
public static function load($id) {
try {
return new User($id);
} catch (NotFoundException $unfe) {
return null;
}
}
// class body here...
}
$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
$this->LoggedUser = User::load($_SESSION['verbiste_user']);
В стороне некоторые версии PHP 4 позволили вам установить $this в NULL внутри конструктора, но я не думаю, что это официально санкционировалось, и "функция" была в конечном итоге удалена.
Ответ 2
AFAIK это не может быть сделано, new
всегда будет возвращать экземпляр объекта.
Что я обычно делаю, чтобы обойти это:
-
Добавление флага ->valid
boolean к объекту, который определяет, был ли объект загружен или нет. Затем конструктор установит флаг
-
Создание функции-обертки, выполняющей команду new
, возвращает новый объект при успешном завершении, или при сбое уничтожает его и возвращает false
-
function get_car($model)
{
$car = new Car($model);
if ($car->valid === true) return $car; else return false;
}
Мне было бы интересно узнать об альтернативных подходах, но я не знаю.
Ответ 3
Считайте это так. Когда вы используете new
, вы получаете новый объект. Период. То, что вы делаете, - это функция, которая ищет существующего пользователя и возвращает ее при обнаружении. Лучше всего это выразить, вероятно, статическую функцию класса, такую как User:: findUser(). Это также можно расширить, когда вы извлекаете классы из базового класса.
Ответ 4
A factory может быть здесь полезен:
class UserFactory
{
static public function create( $id )
{
return (
filter_var(
$id,
FILTER_VALIDATE_INT,
[ 'options' => [ 'min_range' => 1, ] ]
)
? new User( $id )
: null
);
}
}
Ответ 5
Когда конструктор выходит из строя по какой-то неизвестной причине, он не возвращает значение NULL или FALSE, но генерирует исключение. Как и все с PHP5. Если вы не обрабатываете исключение, то script прекратит выполнение с ошибкой "Невыключить исключение".
Ответ 6
может быть что-то вроде этого:
class CantCreateException extends Exception{
}
class SomeClass {
public function __construct() {
if (something_bad_happens) {
throw ( new CantCreateException());
}
}
}
try{
$obj = new SomeClass();
}
catch(CantCreateException $e){
$obj = null;
}
if($obj===null) echo "couldn't create object";
//jaz303 stole my idea an wrap it into a static method