У меня есть этот код. Возможно ли, чтобы конструктор объекта- User
каким-то образом $this->LoggedUser
с ошибкой, так что $this->LoggedUser
присваивается значение NULL
и объект освобождается после возврата конструктора?
$this->LoggedUser = NULL; if ($_SESSION['verbiste_user'] != false) $this->LoggedUser = new User($_SESSION['verbiste_user']);
Предполагая, что вы используете 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) {} }
Для ясности вы можете обернуть это статическим методом:
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 внутри конструктора, но я не думаю, что это официально санкционировалось, и «функция» была в конечном итоге удалена.
AFAIK это не может быть сделано, new
всегда будет возвращать экземпляр объекта.
Что я обычно делаю, чтобы обойти это:
Добавление в объект ->valid
логический флаг для объекта, который определяет, был ли объект загружен или нет. Затем конструктор установит флаг
Создание функции-обертки, которая выполняет new
команду, возвращает новый объект при успешном выполнении, или при сбое уничтожает его и возвращает false
–
function get_car($model) { $car = new Car($model); if ($car->valid === true) return $car; else return false; }
Мне было бы интересно узнать об альтернативных подходах, но я не знаю.
Подумайте об этом. Когда вы используете new
, вы получаете новый объект. Период. То, что вы делаете, – это функция, которая ищет существующего пользователя и возвращает ее при обнаружении. Лучше всего это выразить, вероятно, статическую функцию класса, такую как User :: findUser (). Это также можно расширить, когда вы получаете классы из базового класса.
Здесь может быть полезен завод:
class UserFactory { static public function create( $id ) { return ( filter_var( $id, FILTER_VALIDATE_INT, [ 'options' => [ 'min_range' => 1, ] ] ) ? new User( $id ) : null ); } }
Когда конструктор не работает по неизвестной причине, он не вернет значение NULL или FALSE, но оно выдает исключение. Как и все с PHP5. Если вы не обрабатываете исключение, скрипт прекратит выполнение с ошибкой Uncaught Exception.
может быть, что-то вроде этого:
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