11

私は100%OO phpに移行する段階にあり、このような質問がたくさんあります。ですから、もしあなたがそれをばかげていると思ったら失礼します。私は、後で修正する必要がないように、最初はオブジェクト指向プログラミングの練習を上手くしようとしています。

これをしても大丈夫ですか?

private function _some_funct($args) {
    // Some code here....
    if ($something) return;

    //Rest of code
}

基本的に、ここには2つの質問があります。

  1. その後、値のないリターンを使用しても大丈夫ですか?私はそれをたくさん使っており、欠点はありませんが、他の誰かのコードでは見たことがありません。私はfalseを返すのを見ただけです。

  2. この方法で関数を停止することは一般的に問題ありませんか、それともプログラムの構造を再考する必要がありますか?

これを使用する例は、私が作成しているCMSです。

public function _init_engines() {
    $this->_session_engine = $this->_dep['SessionEngine'];
    $this->_login_engine = $this->_dep['LoginEngine'];
    if ($this->_dep['User'] == false) return;   
    $this->_security_engine = $this->_dep['SecurityEngine'];
    //Other engines go here.......
}

そこで、システムにセッションを開始させ、セッション変数を設定してから、ユーザーがログインしているかどうかを確認します。ユーザーがログインしていない場合は、LoginEngineがそれを処理し、「Login」モジュールをロードします。Loginモジュールがロードされたら、他のエンジンは必要ないため、インスタンス化されたくありません。dieまたはexitを使用することもできますが、それではスクリプト全体の実行が停止します。このように、私のスクリプトは実行を終了し、ベンチマークやその他のいくつかのものなど、エンジンではない他のものはまだ実行されます。これはまさに私が望むものです。繰り返しますが、ここで私の論理を再考する必要がありますか、それともあなたの意見ではこの方法で大丈夫ですか?

4

3 に答える 3

5

return次の場合、値がなくても問題ありません。

  1. インターフェイスは、明示的に--docblock状態@return void(関数で結果値が必要ない場合)または@return sometype|nullwhere sometypeis stringintなどのようなものを示します。
  2. そのような関数/メソッドからの戻り値を使用するコードは、戻り値isset()を使用する前にチェックします-これは、コードを使用している人(または自分自身)がコードをチェックするのを忘れた場合にバグを引き起こす可能性があります。

return次の場合、値がない場合はOKではありません。

  1. エラーが発生しました-代わりに例外を使用してください。次のことができるため、例外の処理がはるかに簡単になります。
    1. グローバルにさえ、外側のスコープのどこでもそれらをキャッチします
    2. 素敵なエラーメッセージを渡す
    3. 例外クラスを拡張して追加機能を提供する
    4. スローされた例外のタイプを正確に確認してください
  2. 特定の結果タイプが予想されます-その場合、デフォルトの「空の」結果を検討するか、何か問題が発生した場合は例外を使用します-isset忘れにくいためよりもはるかに優れています-例外は「大音量」の方法ですエラーが発生したと言います。

die()また、エラーを使用したり「処理」したりしないでくださいexit()。エラーの技術的な詳細をユーザーに表示することは非常に悪い習慣です。

あなたの_init_engines()方法に関しては-残りを知らずにそれが正しいか間違っているかを言うのは本当に難しいです。

PHPでのOOPの良い例に興味がある場合は、Symfonyを参照することをお勧めします。

于 2012-11-30T19:04:54.050 に答える
0

これは、単一のリターンポイントと複数のリターンポイントの宗教的な戦いを掘り下げますが、彼女は私たちが行きます...

関数の継続を回避するために実行フロー制御として値や実際の必要性なしに多くのリターンを使用することは、かなり貧弱な形式です。それは一種の魔法の「goto」ステートメントキャンプにあります。はい、あなたはそれを行うことができますが、特にそれがいくつかの一般的なケースのためにあなたの機能から短絡するために早い段階でほんの少しのリターンではない場合、私は実際にそれをすることに反対票を投じます。

関数を再構築して戻り値がないようにしますが、必要のないコードは実行しませんか?関数/メソッドが大きくて再構築が容易であることがわかった場合、それはおそらく、それらをより小さく、より簡潔なメソッド/関数に分割したいという意味のシグナルです。

  public function _init_engines() {
    $this->_session_engine = $this->_dep['SessionEngine'];
    $this->_login_engine = $this->_dep['LoginEngine'];
    if ($this->_dep['User'] != false){ 
         $this->_security_engine = $this->_dep['SecurityEngine'];
    } else if (){
       //Other engines go here.......
    } 
    //no useless return needed
  }
于 2012-11-30T18:37:55.213 に答える
0

他の人が言ったように、を使用することに欠点はありませんreturn;return false;関数が何をしたかを判断するために、可能であれば、意味のあるものを返すことが通常は望ましいので、通常はわかります。あなたが「それが何をしたとしても、それreturn;は大丈夫です」という状態にあるなら、それなら完全に受け入れられます。

マルチリターンに関しては、実行を続行しないことを決定するのに十分な条件がある場合は、複数の出口ポイントを使用することをお勧めします。たとえば、が必要で、User ID受け取っていない場合、残りのデータをチェックしても意味がない可能性があります。このような場合、関数を.のようなものですぐに終了することができますreturn RES_INVALID_USERIDreturnそのような場合、私はチェーンよりも複数を好みますif..else(ネストされている場合はさらに悪いです)。

于 2012-11-30T19:04:28.987 に答える