私はこれを自分でやろうとしていて、うまくいくように見える解決策を見つけました。
質問者に別の解決策を使用するように言って質問に答えようとしていた他の人たちに応えて、私は質問の理由も説明しようとします。元の投稿者も私も例外を使用したくないのは、例外処理機能を使用せず、このクラスを使用するコードにその負担をかけるためです。少なくとも私にとっては、これを使用できるようにすることが重要でした。非オブジェクト指向または非例外ベースのスタイルで記述される可能性のある他のPHPコードでシームレスにクラス化されます。多くの組み込みPHP関数は、失敗したプロセスに対してfalseの結果が望ましいように記述されています。同時に、このオブジェクトを独自のコードで特別な方法で処理できるようにしたい場合があります。
たとえば、次のようなことをしたいと思うかもしれません。
if ( !($goodObject = ObjectFactory::getObject($objectType)) ) {
// if $objectType was not something ObjectFactory could handle, it
// might return a Special Case object such as FalseObject below
// (see Patterns of Enterprise Application Architecture)
// in order to indicate something went wrong.
// (Because it is easy to do it this way.)
//
// FalseObject could have methods for displaying error information.
}
これは非常に単純な実装です。
class FalseObject {
public function __toString() {
// return an empty string that in PHP evaluates to false
return '';
}
}
$false = new FalseObject();
if ( $false ) {
print $false . ' is false.';
} else {
print $false . ' is true.';
}
print '<br />';
if ( !$false ) {
print $false . ' is really true.';
} else {
print $false . ' is really false.';
}
//予期しないことが起こっていないことを確認するために、$falseを出力しています。
出力は次のとおりです。
は偽です。本当に間違っています。
私はこれをテストしましたが、クラス内に次のような宣言された変数がある場合でも機能します。
class FalseObject {
const flag = true;
public $message = 'a message';
public function __toString() {
return '';
}
}
もう少し興味深い実装は次のとおりです。
class FalseException extends Exception {
final public function __toString() {
return '';
}
}
class CustomException extends FalseException { }
$false = new CustomException('Something went wrong.');
以前と同じテストコードを使用すると、$falseはfalseと評価されます。