web-dev-qa-db-ja.com

PHP NULLを返すコンストラクタ

私はこのコードを持っています。 Userオブジェクトコンストラクターが何らかの理由で失敗し、$this->LoggedUserにはNULL値が割り当てられ、コンストラクターが戻った後にオブジェクトは解放されますか?

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

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に設定できましたが、正式に認可されたとは思われず、「機能」は最終的に削除されました。

65
jaz303

これはできませんが、newは常にオブジェクトのインスタンスを返します。

これを回避するために私が通常行うことは:

  • オブジェクトが正常にロードされたかどうかを決定する->valid booleanフラグをオブジェクトに追加します。コンストラクターはフラグを設定します

  • newコマンドを実行し、成功した場合は新しいオブジェクトを返し、失敗した場合はそれを破棄してfalseを返すラッパー関数を作成します

-

function get_car($model)
      {
        $car = new Car($model);
        if ($car->valid === true) return $car; else return false;
     } 

代替アプローチについて聞いてみたいと思いますが、知りません。

12
Pekka 웃

このように考えてください。 newを使用すると、新しいオブジェクトが取得されます。限目。あなたがしていることは、既存のユーザーを検索し、見つかったときにそれを返す関数があることです。これを表現するのに最適なのは、おそらくUser :: findUser()などの静的クラス関数です。これは、基本クラスからクラスを派生させる場合にも拡張可能です。

5
Wim

ファクトリはここで役に立つかもしれません:

class UserFactory
{
    static public function create( $id )
    {
        return (
            filter_var( 
                $id,
                FILTER_VALIDATE_INT, 
                [ 'options' => [ 'min_range' => 1, ] ]
            )
                ? new User( $id )
                : null
        );
  }
}
4
user212218

コンストラクターが何らかの不明な理由で失敗した場合、NULL値またはFALSEを返しませんが、例外をスローします。 PHP5のすべてと同様。例外を処理しない場合、スクリプトはUncaught Exceptionエラーで実行を停止します。

4
TheGrandWazoo

多分このようなもの:

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
useless