У меня есть этот код. Действительно ли это возможно для a User
конструктор Object, чтобы так или иначе перестать работать так, чтобы $this->LoggedUser
присвоен a 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 внутри конструктора, но я не думаю, что когда-либо было официально санкционировано, и «функция» в конечном итоге была удалена.
, возможно, что-то вроде этого:
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
Когда конструктор дает сбой по неизвестной причине, он не возвращает значение NULL или FALSE, но генерирует исключение. Как и все с PHP5. Если вы не обрабатываете исключение, скрипт перестанет выполняться с ошибкой Uncaught Exception.
Вот что я придумал.
Component[] comps = myPanel.getComponents();
for (Component comp:comps){
comp.setEnabled(false);
}
-121--1740973- Я решил забыть захватить сам символ backspace, я программно захватил состояние, сравнивая длины последовательности до и после действия размещения символа метода textField: shouldChireInRange: replacureString:
. Код:
if ([[textField1.text stringByReplacingCharactersInRange:range withString:string] length] < textField1.text.length)
{
//do nothing
}
else
{
//more programme code;
}
-121--4501553- AFAIK это невозможно, new
всегда возвращает экземпляр объекта.
То, что я обычно делаю, чтобы обойти это:
Добавление - > допустимого
логического флага к объекту, который определяет, был ли объект успешно загружен или нет. Конструктор установит флаг
Создание функции-оболочки, которая выполняет команду new
, возвращает новый объект при успехе или при сбое уничтожает его и возвращает false
-
function get_car($model)
{
$car = new Car($model);
if ($car->valid === true) return $car; else return false;
}
Мне было бы интересно услышать об альтернативных подходах, но я не знаю никаких.
Рассмотрите это так.Когда вы используете new
, вы получаете новый объект. Период. Что вы делаете, так это у вас есть функция, которая ищет существующего пользователя и возвращает его при обнаружении. Лучше всего это выразить, вероятно, с помощью функции статического класса, такой как User :: findUser (). Это также расширяемо, когда вы производите свои классы из базового класса.