1

すべて同じ親クラスを持つオブジェクトのリストを調べていますが、それらは多くのサブクラスの1つからのインスタンスである可能性があります。オブジェクトの実際のタイプに応じて、少し異なる操作を実行したいと思います。

オブジェクトタイプに基づいてさまざまなコードブロックを実行するにはどうすればよいですか?

Javaでは、処理したいタイプごとに処理関数をオーバーロードしますが、PHPではこれを許可していません。

背景: ゴードンのコメントに。

オブジェクトのグループからフォームを作成しています。特定のタイプのフォーム要素を表すために拡張されたスーパークラスコンポーネント。TextInput extends Componentコンポーネントには、他のコンポーネントを保持する機能があります。私たちは、彼らが実際の表現に責任を持つことを望んでいません。

現在HTMLの作成に取り組んでいますが、.PDFやその他の形式の作成にHTMLを使用したい場合があります。

したがって、コンポーネントを通過し、それに含まれるコンポーネントを再帰的に通過するコードがあります。コンポーネントのタイプに応じて、異なる出力を作成する必要があります。

4

3 に答える 3

2

使用する

if($myobject instanceof class1){
}elseif($myobject instanceof class1){
}

または

switch(get_class($myobject)){
    case 'class1':
       break;
    case 'class2':
       break;
}

また、オープン/クローズの原則に違反しないように注意してください。コードのその部分をコントローラーの特定の部分ではなくクラスに配置すると、コードの重要な再利用機能が損なわれることになります。

オープン/クローズド原則

プラグインシステムを実行したことはありませんか?もしそうなら、そのプラグインを正しく処理するために、コードにロードラインをハードコーディングするようにユーザーに依頼しなかったと思いますか?

通常は、親を変更せずにクラスを拡張できるようにする必要があります。拡張はオープンな原則である必要があり、コードの追加は拡張と同じくらい簡単である必要がありますが、親クラスを変更する必要はありません。

したがって、親または別のクラス内にスイッチを追加して、そのクラスのすべての可能なバージョンを処理すると、ユーザーはクラスを変更して機能を追加する必要があるため、オープン原則に違反します...

于 2012-06-22T14:33:21.950 に答える
2
  1. オブジェクトのすべての共通機能を表し、オブジェクトに必要な他のメソッドを指示する抽象クラスを作成して、毎回同じインターフェイスで作業していることを確認できるようにします(これらは抽象メソッドと呼ばれます)。

  2. 次に、特定のタイプのオブジェクトごとにサブクラスを作成します。メインの抽象クラスのすべての抽象メソッドを実装する必要があります。

  3. 次に、ファクトリパターンを使用して、オブジェクトタイプ(別名サブクラス)を決定するフラグに基づいて適切なオブジェクトを動的に作成します。

于 2012-06-22T14:31:04.887 に答える
2

このようなsmthを試してください

function objectProcessor_A($o) {}
function objectProcessor_B($o) {}
function objectProcessor_C($o) {}

foreach($objects AS $o) {
    if(function_exist("objectProcessor_" . get_class($o)))
        call_user_func("objectProcessor_" . get_class($o), $o);
}

さて、最善の解決策は継承を使用することだと思います。$ oの動作/ライブラリコードを変更できませんか?ファクトリを使用してメソッドを無名関数として追加するよりも:

class OFactory {
    static function getO($type) {
        $r = new $type();
        if($type === "A") {
            $r.processor = function() {...};
        } else if($type === "B") {
            $r.processor = function() {...};
        } else if($type === "C") {
            $r.processor = function() {...};
        }
        return $r;
    }
}

$a = OFactory::getO("A");
call_user_func($a->processor);

$b = OFactory::getO("B");
call_user_func($b->processor);
于 2012-06-22T14:31:47.007 に答える