Конструктор PHP для возврата ПУСТОГО УКАЗАТЕЛЯ

У меня есть этот код. Действительно ли это возможно для a User конструктор Object, чтобы так или иначе перестать работать так, чтобы $this->LoggedUser присвоен a NULL значение и объект освобождены после того, как конструктор возвращается?

$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
  $this->LoggedUser = new User($_SESSION['verbiste_user']);    
50
задан Trott 29 September 2011 в 09:19
поделиться

5 ответов

Предполагая, что вы используете 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 внутри конструктора, но я не думаю, что когда-либо было официально санкционировано, и «функция» в конечном итоге была удалена.

66
ответ дан 7 November 2019 в 10:54
поделиться

, возможно, что-то вроде этого:

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
3
ответ дан 7 November 2019 в 10:54
поделиться

Когда конструктор дает сбой по неизвестной причине, он не возвращает значение NULL или FALSE, но генерирует исключение. Как и все с PHP5. Если вы не обрабатываете исключение, скрипт перестанет выполняться с ошибкой Uncaught Exception.

4
ответ дан 7 November 2019 в 10:54
поделиться

Вот что я придумал.

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;
     } 

Мне было бы интересно услышать об альтернативных подходах, но я не знаю никаких.

12
ответ дан 7 November 2019 в 10:54
поделиться

Рассмотрите это так.Когда вы используете new , вы получаете новый объект. Период. Что вы делаете, так это у вас есть функция, которая ищет существующего пользователя и возвращает его при обнаружении. Лучше всего это выразить, вероятно, с помощью функции статического класса, такой как User :: findUser (). Это также расширяемо, когда вы производите свои классы из базового класса.

5
ответ дан 7 November 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: