33

次のコードを見ると、コンストラクターが値を返していることがわかります。コンストラクターはオブジェクトのみを返すと思いました。誰かが私に何が欠けているか教えてもらえますか?

public function __construct($username = null, $password = null){
        $urlLogin = "{$this->apiHost}/login/$username";

        $postData = sprintf("api_type=json&user=%s&passwd=%s",
                            $username,
                            $password);
        $response = $this->runCurl($urlLogin, $postData);

        if (count($response->json->errors) > 0){
            return "login error";    
        } else {
            $this->modHash = $response->json->data->modhash;   
            $this->session = $response->json->data->cookie;
            return $this->modHash;
        }
    }
4

6 に答える 6

57

確かにあなたは正しいです。コンストラクターの戻り値では、(作成したオブジェクトを使用する以外は)何もできません。

ですから、あなたは何も見逃していません。そのコードを書いたのは開発者です。

関数を直接呼び出す場合、コンストラクターからの戻り値を使用することは技術的に可能です。

$obj->__construct();

これにより、コンストラクターの戻り値を使用できるようになります。ただし、これは非常にまれであり、あまりお勧めできません。

于 2012-08-10T14:58:17.903 に答える
25

コンストラクターの戻り値でやりたいことは何でもできるので、「コンストラクターの戻り値で何もできない (コンストラクターが作成したオブジェクトを使用する以外は)」というのは正しくありません。コンストラクターの戻り値は、「それ」が作成したオブジェクトではありません。コンストラクターはオブジェクトを作成しません (newキーワードは作成します)。コンストラクターの戻り値は、他の関数の戻り値と同じです。さらに、コンストラクターを呼び出すためにオブジェクトが既に存在している必要があるというのも誤りです。これは完全に有効です:

$parent_constructor_return_value = parent::__construct();

例えば:

abstract class MyBase {
    function __construct () {
        return "Hello, world.";
    }
}
class MyDerived extends MyBase {
    function __construct () {
        echo parent::__construct();
    }
}
new MyDerived(); // prints "Hello, world."

これは可能ですが、それがベスト プラクティスになるシナリオは思いつきません。結局のところ、値を取得する以外のメソッドをいつでも呼び出すことができ、parent::__construct()失われるのはあいまいさだけです。エラー処理の方法として使用できると思います-同じことを達成するには、他に2つの方法があります。

  1. 親コンストラクターで例外をスローし、派生コンストラクターで例外をキャッチします。
  2. エラーが発生したことを示すプロパティを親コンストラクターに設定し、派生コンストラクターでそれらのプロパティの状態を確認します。

親コンストラクターのエラーが例外的でない場合、一時的なエラー情報をオブジェクト プロパティとして格納するのではなく、親コンストラクターにエラー値を返すように決定した可能性があります。もちろん、親のメソッドに名前を付ける唯一の理由__constructは、親クラスが抽象クラスではなく、それ自体をインスタンス化できる場合です。ただし、そのコンテキストでは、返されたエラー メッセージは表示されません。したがって、悪いパターンです。悪い。コンストラクターは値を返すことを意図していません。つまり、このメカニズムを利用して、アーキテクチャ上のワームの缶を開けることになります。

于 2014-01-13T19:30:34.387 に答える
4

このページを参照してください:クラスのコンストラクター関数で値を返す

それを読んで:-

コンストラクターは戻り値を取得しません。それらは完全にクラスをインスタンス化するのに役立ちます。

すでに行っていることを再構築せずに、ここで例外を使用することを検討できます。

public function __construct ($identifier = NULL)
{
  $this->emailAddress = $identifier;
  $this->loadUser();
}

private function loadUser ()
{
    // try to load the user
    if (/* not able to load user */) {
        throw new Exception('Unable to load user using identifier: ' . $this->identifier);
    }
}

これで、この方法で新しいユーザーを作成できます。

try {
    $user = new User('user@example.com');
} catch (Exception $e) {
    // unable to create the user using that id, handle the exception
}
于 2012-08-10T15:01:08.023 に答える
3

コンストラクターは何も返しませんが、コンストラクターから戻ることができます(何らかの理由でメソッドの実行を停止しますが、オブジェクトは作成できます)。

于 2012-08-10T14:58:33.310 に答える
2

他の言語とは異なり、PHPではコンストラクターを明示的に呼び出すことができます。それは単なる別の機能です。元の作成者は、コンストラクターで失敗する可能性のあるコードを最初に配置することを決定し、失敗後に初期化を再実行する方法が必要であることに気付いたようです。

$result = $user->__construct($username, $password)

実際に機能し、戻り値を取得します。それは明らかに物事を行うための醜い方法です。

私の意見では、コンストラクターで副作用を引き起こすコードを用意するのは良い習慣ではありません。コードを別の関数に入れて、その機能を明確に示す名前を付けます。

于 2012-08-10T15:25:28.240 に答える