Intereting Posts
Node.js `crypto.final` заставляет зашифрованный результат отличаться от PHP` mcrypt_encrypt` Могу ли я зашифровать PHP-источник или скомпилировать его, чтобы другие его не видели? и как? Установите корень документа в приложении Zend Framework 1.12.x в службе Azure Cloud Service Класс Symfony2, не найденный в цепочке, в двух связках Есть ли причина использовать isset ()? Шрифт Bootstrap glyphicons font не найден при использовании assetic в prod на Symfony2 Добавление, обновление и редактирование XML-файла с помощью PHP Закрепление файлов в папке без родительской папки в зашифрованном файле Согласование множественного появления одного и того же символа с preg_match Laravel 4 отправляет запрос от контроллера на внешний URL с данными Перенаправить сайт на мобильный сайт и с мобильного на рабочий стол? Нет файлов cookie с php cURL PHP как языки, которые предлагают встроенный HTML css исчезает при попытке создать чистый URL-адрес Проблема с помощником Ajax в Cake PHP

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

У меня есть этот код. Возможно ли, чтобы конструктор объекта- 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