2009-05-29 12 views
6

phpのコンストラクタから正常に終了することは可能ですか?私はクラスのメソッドのいずれかが設定ファイルに基づいて実行する必要があるかどうかを確認したいので、私はこれを実現しようとしているコンストラクタで正常に終了できますか?

class Foo { 

function __construct() 
{ 

    $active = false; 

    if(!$active) 
    { 
    return false; 
    } 

} 

} 

の効果に何か。私はメソッドが実行されているかどうかを確認するために、すべてのメソッドの設定ファイルをチェックする必要はありません。

答えて

7

「優雅に」意味する内容によって異なります。あなたはコンストラクタが失敗したい場合は、例外をスローしたり、工場出荷時のパターンを使用することができます。

class FooFactory { 
    function makeFoo() { 
     return $someConstraint ? null : new Foo(); 
    } 
} 

たぶん、あなたはそれはあなたが達成したいです正確に何に少し手の込んだことができます。

+1

これは、オブジェクト指向プログラミングではありません。$ activeをfalseに設定した場合は、メソッドを実行しないようにし、他のページを正常にロードすることを望みます。例えば、私がダイを置くと、構築物では、そのオブジェクトを呼び出したすべてのページで死ぬでしょう。 –

+0

その場合、$ activeがfalseの場合はファクトリパターンを使用してダミーオブジェクトを返し、そうでない場合は "実"オブジェクトを返すことができます。これは最もエレガントな解決策ではありませんが、それはうまくトリックを行うだろう。 – n3rd

0

N3rdは非常にクールな解決策を提案していると思いますが、ここではもっと簡単な方法があります。

+0

動作しません。私は、構築物に値を返すことは可能だとは思わない。 :/ –

+0

それは仕事量です。 のような関数を呼び出すことができるので、($ this-> check($ active)){do something} – Mantichora

1

コンストラクタが失敗した場合は、例外をスローする必要があります。偽の値は返しません。 Cのような言語を使用していない限り、オブジェクトの構築における例外は決して解体できないことを意味します。

これは、例外によってプログラムで処理され、不正なデータが返されるためです。 -1などの値を返すと、プログラムはサイレントモードで続行し、後で問題が発生するまで無視します。例外を投げることで、これらのサイレントバグがコードに入るのを防ぐことができます。正しく構築できなかった場合はfalseを返しますが、あなたの同僚は実際にブール値であることを確認するために構築したオブジェクトであるとは思っていないかもしれません。

3

爆発してください。コンストラクターには優雅な失敗というものはありません。おそらく、呼び出し側のコードではあるが、コンストラクタではない。例外をスローして適切に処理します。

3

私はあなたのところに来るプロキシパターンのにおいをすることができます。あなたが達成しようとしているのは、しかしコンストラクタが正常に失敗したではなく、は、いくつかの$アクティブな基準に基づいてオブジェクト上でメソッドを呼び出すことを許可していません。

Thisが正しい方向を指しているかもしれません。あるいは、そうではないかもしれません(= >>私はリンク先のページが嫌いですが、PHPにとっては最高のものでした)。おそらく他のソースからプロキシに読み取りを与えてください。基本的には、ProxyObjectはの実オブジェクトへの参照を持ちます。のメソッドはです。あなたのクライアントコードは、と同じようにProxyObject上のメソッドを呼び出します。、ProxyObjectはメッセージをに渡すかどうか、あるいは何も返さないか、nullを返すかどうかを決定します。ダミー値。いいですね?

2

コンストラクタがあまりにも多くのロジックを行う場合、それはうまく設計されていません。 空のままにして、設定メソッドで設定を渡して失敗させます。私は別のファイルから、このクラスを呼んでいる

$o = new myObject(); 
if (!is_object($o)) // then what??? 
関連する問題