Подтвердить что ты не робот

PHP-конструктор возвращает NULL

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

$this->LoggedUser = NULL;
if ($_SESSION['verbiste_user'] != false)
  $this->LoggedUser = new User($_SESSION['verbiste_user']);    
4b9b3361

Ответ 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