私はこのコードを持っています。 User
オブジェクトコンストラクターが何らかの理由で失敗し、$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に設定できましたが、正式に認可されたとは思われず、「機能」は最終的に削除されました。
これはできませんが、new
は常にオブジェクトのインスタンスを返します。
これを回避するために私が通常行うことは:
オブジェクトが正常にロードされたかどうかを決定する->valid
booleanフラグをオブジェクトに追加します。コンストラクターはフラグを設定します
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